簡體   English   中英

C#中的快速字節數組屏蔽

[英]Fast byte array masking in C#

我有一個具有一些屬性的結構(如int A1int A2 ,...)。 我將一個struct列表作為二進制文件存儲在一個文件中。

現在,我正在使用二進制閱讀器將文件中的字節讀入Buffer ,我想根據結構的屬性應用過濾器(如.A1 = 100 & .A2 = 12 )。

性能在我的場景中非常重要,所以我將過濾條件轉換為字節數組( Filter ),然后我想用Filter屏蔽Buffer 如果掩碼的結果等於Filter ,則Buffer將轉換為struct。

問題:屏蔽和比較兩個字節數組的最快方法是什么?

更新: Buffer大小超過256個字節。 我想知道是否有更好的方法而不是迭代BufferFilter每個字節。

嘗試使用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位機器上)。

我通常采用的方法是使用unsafe代碼。 您可以使用fixed關鍵字將byte[]作為long* ,然后可以在1/8的迭代中迭代 - 但使用相同的位操作。 您通常會剩下幾個字節(從它不是8字節的精確倍數) - 之后只需手動清理它們。

一旦你有兩個數組 - 一個來自讀取文件而另一個來自過濾器,你需要的只是數組的快速比較。 查看以下使用不安全或PInvoke方法的帖子。

比較兩個字節數組的最快方法是什么?

比較.NET中的兩個字節數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM