我有一個大型的字節數組,其中大部分爲0,但有些值需要處理。如果這是C++或不安全的C#我會使用一個32位指針,只有當前的32位不是0,我會看看單個字節。這使得通過全部0個塊的掃描速度更快。不幸的是,這必須是安全的C#:-)作爲uint數組掃描字節數組
我可以使用一個uint數組,而不是一個字節數組,然後操縱個別字節,但它使我做的比我想象的更雜亂。我正在尋找更簡單的東西,比如指針示例(我想念指針嘆息)
謝謝!
我有一個大型的字節數組,其中大部分爲0,但有些值需要處理。如果這是C++或不安全的C#我會使用一個32位指針,只有當前的32位不是0,我會看看單個字節。這使得通過全部0個塊的掃描速度更快。不幸的是,這必須是安全的C#:-)作爲uint數組掃描字節數組
我可以使用一個uint數組,而不是一個字節數組,然後操縱個別字節,但它使我做的比我想象的更雜亂。我正在尋找更簡單的東西,比如指針示例(我想念指針嘆息)
謝謝!
如果代碼必須安全,並且您不想使用更大的類型和「移位」,那麼您必須迭代每個字節。
(編輯)如果數據足夠稀疏,您可以使用字典來存儲非零值;那麼找到非零值是微不足道的(而且稀疏數組變得很便宜)。
您可以訪問字符
string.ToCharArray()
或者您也可以訪問原始字節[]
Text.Encoding.UTF8Encoding.GetBytes(stringvalue)
歸根結底,我認爲你需要在這裏是
MemoryStream stream;
stream.Write(...)
那麼你將可以直接刪除內存的緩衝區
還有UnmanagedMemoryStream
,但我不知道是否會使用內部
誰提到了字符串? – 2011-04-24 18:04:11
嗯,我想我可以說:「我做了」LOL – sehe 2011-04-24 18:09:25
不安全電話我會關注你這個傢伙說: Using SSE in c# is it possible?
基本上,編寫C/C一點點++,可能使用SSE來有效地實現掃描部分,並從C#中調用它。
在某些方面,「通過隱形不安全:將不安全的代碼放在我們看不到的地方」......當然,OP當然是否合理。 – 2011-04-24 18:23:52
我想要,但它必須在Windows Phone 7上運行,所以它不是一個選項:( – Rabbit 2011-04-24 19:44:26
@Marc:它不僅僅是隱形的,它允許應用SSE指令,否則將不會被使用(因爲它們不能被明確地編碼在.NET本身,據我所知) – 2011-04-24 21:09:38
可以使用BitConverter
類:
byte[] byteArray = GetByteArray(); // or whatever
for (int i = 0; i < b.Length; I += 2)
{
uint x = BitConverter.ToUInt32(byteArray, i);
// do what you want with x
}
另一個選擇是創建從字節數組一個MemoryStream
,然後使用一個BinaryReader
從中讀取32位值。
這缺乏OP正在尋找的性能提升。 – 2011-04-24 20:36:36
你可能是對的,我也不知道有什麼辦法做到這一點,很遺憾,這是一個非常簡單的性能提升,移位等等,實際上會讓它變慢大多數字節不是零的情況(但通常它們大多爲零)。 – Rabbit 2011-04-24 19:49:10
@ user72185 - 有一點需要檢查; WP7是否支持顯式佈局對結構?我不認爲*它確實,但值得一試? – 2011-04-24 20:22:17