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

当比较来自两个单独的 byte[] 源(数组/指针)的单个字节值时,如何执行 case INSENSITIVE 比较?

我有一个非常大的字节数组,其中包含我通过指针访问的字符串的“干草堆”,并且我将其与“针”模式进行比较,但目前它仅在存在精确区分大小写的匹配时才返回。

是否可以创建一个包含从上到下的值的查找字典并在比较循环中使用它,还是有更快的方法?(性能方面)

编辑1:

字符串是 UTF8 编码的。

期望的行为是:在比较 a,a 时返回 true;一个,一个;或a,A。但由于 UTF8 中的 'A' 的值为 65,而 'a' 的值为 97,我无法进行不区分大小写的比较。


拉丁的传说
浏览 177回答 2
2回答

阿晨1998

小写和大写 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 和其他低级“黑客”进行优化的方法.....

一只斗牛犬

将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);}
打开App,查看更多内容
随时随地看视频慕课网APP