2010-08-24 82 views
3

我不安全的方法接受一個集合byte[]秒。所有這些byte[]都是相同的大小。初始化字節*集合在C#

我需要遍歷所有這些,尋找一定的模式。搜索本質上是重新詮釋鑄風格:在每個偏移,我需要考慮的值就好像它是一個浮動,雙,短,一個int,等於是得到一個byte*每個輸入byte[]和增加它的每個迭代似乎是一種自然的方法。

不幸的是我無法找到任何方式來創建的byte*集合 - 或更具體地說,從陣列的集合初始化。有任何想法嗎?

這裏的任務的有點做作的版本:

static unsafe void SearchIteration(List<byte[]> arrays, byte[] resultArr) 
{ 
    fixed (byte* resultFix = resultArr) 
    { 
     byte* resultPtr = resultFix; 
     byte*[] pointers = new byte*[arrays.Count]; 

     <some code to fix all the arrays and store the pointers in "pointers"> 

     int remaining = resultArr.Length; 
     while (remaining > 0) 
     { 
      <look at resultPtr and each of the pointers and update *resultPtr> 

      remaining--; 
      for (int i = 0; i < pointers.Length; i++) 
       pointers[i]++; 
     } 
    } 
} 

本質的問題是如何與arrays地址初始化pointers,而釘扎陣列,使GC不動他們。

+0

究竟什麼是您的對象的集合,什麼是字節[]? – Raynos 2010-08-24 20:23:16

+0

你真的需要讓所有的byte []數組中在同一時間被固定,或者你可以處理這些接二連三? – dtb 2010-08-24 20:28:22

+0

@Raynos對不起,我簡化了一下,忘了刪除一個對象的引用。現在走了。只是'byte []'s。 – 2010-08-24 20:32:01

回答

2

使用GCHandle.Alloc()System.Runtime.InteropServices

var handles = new GCHandle[arrays.Count]; 
byte*[] pointers = new byte*[arrays.Count]; 
for(int i = 0; i < arrays.Count; ++i) 
{ 
    handles[i] = GCHandle.Alloc(arrays[i], GCHandleType.Pinned); 
    pointers[i] = (byte*)handles[i].AddrOfPinnedObject(); 
} 
try 
{ 
    /* process pointers */ 
} 
finally 
{ 
    for(int i = 0; i < arrays.Count; ++i) 
    { 
     handles[i].Free(); 
    } 
} 
+0

這引腳的物體。但是,指針指向哪裏(數組內容或數組對象的CLR對象頭)? – dtb 2010-08-24 20:37:05

+0

它指向exatly您所期望的 - 第一個數組元素 – max 2010-08-24 20:37:56

+0

謝謝最大,這個工程。忘記接受更早。 – 2010-10-11 23:58:27