当前位置 : 主页 > 编程语言 > c语言 >

C#将包含文本的两个byte []数组比较为小写

来源:互联网 收集:自由互联 发布时间:2021-06-25
当比较来自两个单独的byte []源(数组/指针)的单个字节值时,如何执行INSENSITIVE案例比较? 我有一个非常大的字节数组,其中包含我通过指针访问的字符串的“haystack”,我将它与“针”模式
当比较来自两个单独的byte []源(数组/指针)的单个字节值时,如何执行INSENSITIVE案例比较?

我有一个非常大的字节数组,其中包含我通过指针访问的字符串的“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和其他低级“黑客”……

网友评论