C#中的快速字节数组屏蔽

时间:2013-11-24 10:42:20

标签: c# .net arrays c#-4.0 bit-manipulation

我有一个包含一些属性的结构(如int A1int A2,...)。我将一个struct列表作为二进制文件存储在一个文件中。

现在,我正在使用二进制阅读器将文件中的字节读入Buffer,我想根据结构的属性(如.A1 = 100 & .A2 = 12)应用过滤器。

在我的场景中,性能非常重要,因此我将过滤条件转换为字节数组(Filter),然后我想用Buffer屏蔽Filter。如果屏蔽结果等于Filter,则Buffer将转换为结构。

问题:屏蔽和比较两个字节数组的最快方法是什么?

更新: Buffer大小超过256个字节。我想知道是否有更好的方法而不是在BufferFilter的每个字节中进行迭代。

3 个答案:

答案 0 :(得分:3)

尝试使用System.BitConverter.ToInt64()的简单循环。像这样:

byte[] arr1;
byte[] arr2;

for (i = 0; i < arr1.Length; i += 8) 
{
    var P1 = System.BitConverter.ToInt64(arr1, i);
    var P2 = System.BitConverter.ToInt64(arr2, i);

    if((P1 & P2) != P1) //or whatever
        //break the loop if you need to.
}

我的假设是比较/屏蔽两个Int64将比一次屏蔽一个字节要快得多(特别是在64位机器上)。

答案 1 :(得分:3)

我通常采用unsafe代码的方法。您可以使用fixed关键字将byte[]作为long*,然后可以在1/8的迭代中迭代 - 但使用相同的位操作。您通常会剩下几个字节(从它不是8个字节的精确倍数) - 之后只需手动清理它们。

答案 2 :(得分:0)

一旦你有两个阵列 - 一个来自读取文件而一个来自过滤器,你需要的只是对阵列的快速比较。查看以下使用不安全或PInvoke方法的帖子。

What is the fastest way to compare two byte arrays?

Comparing two byte arrays in .NET