加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 01:28:08 所属栏目:百科 来源:网络整理
导读:当比较来自两个单独的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和其他低级“黑客”……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读