当比较来自两个单独的byte []源(数组/指针)的单个字节值时,如何执行INSENSITIVE案例比较? 我有一个非常大的字节数组,其中包含我通过指针访问的字符串的“haystack”,我将它与“针”模式
我有一个非常大的字节数组,其中包含我通过指针访问的字符串的“haystack”,我将它与“针”模式进行比较,但目前只有在存在确切区分大小写的匹配时才会返回.
是否可以创建一个包含从上到下值的查找字典,并在比较循环中使用它还是有更快的方法? (性能明智)
EDIT1:
字符串是UTF8编码的.
期望的行为是:比较a,a时返回true; A,A;或者a,A.但由于UTF8中的“A”值为65而“a”的值为97,因此我不能进行不区分大小写的比较.
小写和大写ACSII和UTF8代码的字节表示的偏移量为32(或hex20),因此您可以实现x == byte [x] ||的比较x == byte [x 32],x =大写字符值.编辑:
假设你真的只需要处理小写和大写英文字母,你就可以通过逐位运算来加快速度,因为你可以同时处理8个字节/字符,因为那些只有第3个最重要的位不同:
‘b’& 0b_1101_1111 ==’B’& 0b_1101_1111
所以你可以用8个字节的块来处理字节数组:
void Main() { byte[] a = "ASDADAGF".Select(x => (byte)(x) ).ToArray(); byte[] b = "asdAdAGF".Select(x => (byte)(x) ).ToArray(); bitCompared(a,b).Dump(); } static bool bitCompared( byte[] b1, byte[]b2) { UInt64 a = BitConverter.ToUInt64(b1, 0); //loop over the index UInt64 b = BitConverter.ToUInt64(b2, 0); UInt64 mask =0b_1101_1111_1101_1111_1101_1111_1101_1111_1101_1111_1101_1111_1101_1111_1101_1111; return (a &= mask) == (b &= mask); }
afaik还有更多的方法来优化SIMD和其他低级“黑客”……