2 回答
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 和其他低级“黑客”进行优化的方法.....
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);
}
- 2 回答
- 0 关注
- 175 浏览
添加回答
举报