为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
拉丁的传说 2022-06-12 10:54:02
当比较来自两个单独的 byte[] 源(数组/指针)的单个字节值时,如何执行 case INSENSITIVE 比较?我有一个非常大的字节数组,其中包含我通过指针访问的字符串的“干草堆”,并且我将其与“针”模式进行比较,但目前它仅在存在精确区分大小写的匹配时才返回。是否可以创建一个包含从上到下的值的查找字典并在比较循环中使用它,还是有更快的方法?(性能方面)编辑1:字符串是 UTF8 编码的。期望的行为是:在比较 a,a 时返回 true;一个,一个;或a,A。但由于 UTF8 中的 'A' 的值为 65,而 'a' 的值为 97,我无法进行不区分大小写的比较。
查看完整描述

2 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

小写和大写 ACSII 和 UTF8 代码的字节表示具有 32(或 hex20)的偏移量,因此您可以实现x == byte[x] || x == byte[x+32]与 x=uppercase char 值的比较。


编辑:


假设您真的只需要处理小写和大写英文字母,您可以使用按位运算来加快速度,因为您可以一次处理 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 和其他低级“黑客”进行优化的方法.....


查看完整回答
反对 回复 2022-06-12
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

将byte数组转换为 astring然后进行不区分大小写的比较。就像是:


bool caseInsensitiveByteArrayComparison(byte[] a, byte[] b) {

    string aString = System.Text.Encoding.UTF8.GetString(a);

    string bString = System.Text.Encoding.UTF8.GetString(b);

    return string.Equals(aString, bString, StringComparison.CurrentCultureIgnoreCase);

}


查看完整回答
反对 回复 2022-06-12
  • 2 回答
  • 0 关注
  • 175 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信