簡體   English   中英

指向Byte []數組的不安全Int32指針

[英]Unsafe Int32 pointer to a Byte[] array

我有一個字節數組,我想通過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返回的指針作為Byte和Int32指針訪問,沒有任何問題。 但是當我嘗試在托管字節數組上創建一個Int32指針時(上面的示例),它似乎抱怨它是托管代碼,所以它不起作用。

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

我的目標:將UInt32和Byte指針都指向一個bytearray,這樣我就可以將Kinect“熱圖”作為整數和單獨顏色讀取。 我知道我可以輕松地在類型之間進行轉換,但由於我正在使用不同格式的多個數組,如果我可以直接訪問它們而不必一直在它們之間進行轉換會更好。 有很多簡單的復制正在進行,所以它只會增加開銷以保持轉換。

好的,有趣的故事。 事實證明,它不僅可以引用空數組,而且還指向某個地方。 這真的搞砸了我的調試。

“UInt32 * bgImgIntPtr =(UInt32 *)bgImgPtr;” 導致MDA異常的原因是陣列未初始化。 制作一個指向bytearray的字節指針的指針是正確的方法。

答案:

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;
   }
}

暫無
暫無

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

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