Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#比较包含小写文本的两个字节[]数组_C#_Arrays_Performance - Fatal编程技术网

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

C#比较包含小写文本的两个字节[]数组,c#,arrays,performance,C#,Arrays,Performance,当比较来自两个单独字节[]源(数组/指针)的单个字节值时,如何执行不区分大小写的比较 我有一个非常大的字节数组,其中包含通过指针访问的字符串的“干草堆”,我将其与“针”模式进行比较,但目前它仅在存在完全区分大小写的匹配时返回 是否可以创建一个包含从高到低的值的查找字典,并在比较循环中使用它,还是有更快的方法?(性能方面) Edit1: 字符串是UTF8编码的 期望的行为是:比较a、a时返回true;A、 A;或者a,a。但是由于UTF8中的“a”的值为65,而“a”的值为97,因此我无法进行不区

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

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

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

Edit1:

字符串是UTF8编码的


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

字节
数组转换为
字符串
,然后进行不区分大小写的比较。比如:

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);
}
代码不知羞耻地从某处偷走。见:


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

    编辑:

    假设您真的只需要处理英文小写字母和大写字母,您可以通过按位操作来加快处理速度,因为您可以一次处理8字节/字符,因为它们之间的差异仅为第三个最高有效位:

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

    此外,还有更多的方法可以使用SIMD和其他低级“黑客”进行优化…

    将每个数组转换为字符串,然后进行不区分大小写的比较…这取决于编码。您正在处理ascii字符串吗?字节的大小写敏感度是什么意思?数组是否表示ascii编码的字符串?小写和大写ACSII代码的偏移量为32,因此您可以将
    x==byte[x]| | byte[x+32]
    与x=大写进行比较,如果我理解正确,UTF8的偏移量应该相同,您的意思是
    x==byte[I]| x==byte[I]+32
    ,或者这应该如何与逻辑or一起工作?(没有批评,我只是不明白,indexoutofrange和wraparound如何)你是对的,这是一个打字错误,但也可以通过按位比较来完成,因为大写和小写字符的onyl相差第二个最重要的位!!我将在后面补充这一点,因为这应该比“正常”字节比较更好@FalcoAlexander是否值得检查字节值是否超出字母范围以避免误报?(十进制为65-122)@FalcoAlexander感谢您的努力哈哈,尽管我担心使用BitConverter会实例化新的阵列并造成巨大的性能损失。尝试在需要比较30mil字节数组的场景中模拟您的操作。我设法在这种情况下挤了进去:
    *x1!=*x2&(*x1<65 | |*x1>122 | |*x2<65 | |*x2>122 | |*x1+32!=*x2)
    首先尝试精确匹配,然后确保x1和x2都在字母表内,然后尝试小写比较。我运行了30多mil次,并使用指针得到了不到5毫秒的时间。谢谢你给我指出了正确的方向!我的示例只是为了说明,使用8字节块进行二进制操作可以在第一步完成。查看
    System.Numerics.Vectors
    以获得对128位和硬件加速数字类型的支持。还可以在位掩码和移位级别上检查字母数字字节。可能是编译器已经完成了,但是请检查StackExchange的汇编程序站点以获得一些非常好的提示…我非常喜欢这种低级别性能优化。您可能会提出一个带有优化标签的新问题,以及一组定义的数据,并从一个示例开始,从而使其成为一个挑战。