gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:21:38 26 4
gpt4 key购买 nike

当比较来自两个单独的 byte[] 源(数组/指针)的单个字节值时,如何执行不区分大小写的比较?

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

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

编辑1:

字符串是 UTF8 编码的。

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

最佳答案

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

编辑:

假设你真的只需要处理小写和大写的英文字母,你可以通过按位运算来加速处理,因为你可以一次处理 8 个字节/字符,因为它们只相差第 3 个最高有效位:

'b' & 0b_1101_1111 == 'B' & 0b_1101_1111

所以你可以处理 8 字节 block 中的字节数组:

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);
}

据我所知,还有更多方法可以使用 SIMD 和其他低级“hacks”进行优化......

关于C# 比较两个包含小写文本的 byte[] 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53748466/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com