2011-01-30 63 views
4

我有一個字節數組,我想通過Int32指針(不安全的上下文)訪問。我這樣做不安全Int32指針字節[]數組

byte[] bgImageBytes = new byte[1000]; 
unsafe 
{ 
    fixed (byte* bgImgPtr = bgImageBytes) 
    { 
     // I have a byte pointer ... How can I get an Int32 pointer? 
    } 
} 

我已經訪問來自kernel32.dll中返回兩者字節和指針的Int32沒有任何問題的指針。但是當我嘗試在託管字節數組上創建一個Int32指針(上面的例子)時,它似乎抱怨它是託管的代碼,所以它不起作用。

只要做UInt32* bgImgIntPtr = (UInt32*)bgImgPtr;導致MDA FatalExecutionEngineError:該CLR已致命地損壞。這通常是由數據損壞引起的,這可能是由許多問題引起的,例如調用格式錯誤的平臺調用函數以及將無效數據傳遞給CLR。

我的目標:將UInt32和Byte指針都指向單個字節陣列,這樣我就可以讀取整數和單獨顏色的Kinect「熱圖」。我知道我可以很容易地在類型之間進行轉換,但是由於我使用不同格式的多個數組,因此如果我可以直接訪問它們而不必在它們之間進行轉換,那將會更好。有很多簡單的複製進行,所以它只會增加開銷,繼續轉換。

+0

是bgImageBytes實際上`新的字節[1000]`?還是被傳遞給非託管代碼? – Marlon 2011-01-30 13:16:01

回答

6

好吧,有趣的故事。原來,它不僅可以引用一個空數組,而且它也指向某處。這真的搞砸了我的調試。 「UInt32 * bgImgIntPtr =(UInt32 *)bgImgPtr;」導致MDA異常的原因是數組未初始化。製作指向字節數組的字節指針是正確的方法。

答案:

byte[] bgImageBytes = new byte[1000]; 
unsafe 
{ 
    // Make a byte pointer to the byte array 
    fixed (byte* bgImgPtr = bgImageBytes) { 
     // Make a UInt32 pointer to the byte pointer 
     UInt32* bgImgIntPtr = (UInt32*)bgImgPtr; 
    } 
}