指向Byte []数组的不安全Int32指针

Ted*_*sen 4 c# pointers

我有一个字节数组,我想通过Int32指针访问(不安全的上下文).我这样做

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

我已经将从kernel32.dll返回的指针作为Byte和Int32指针访问,没有任何问题.但是当我尝试在托管字节数组上创建一个Int32指针(上面的示例)时,它似乎抱怨它是托管代码,所以它不起作用.

简单地UInt32* bgImgIntPtr = (UInt32*)bgImgPtr;在MDA FatalExecutionEngineError中执行结果:CLR已被致命损坏.这通常是由数据损坏引起的,数据损坏可能是由许多问题引起的,例如调用格式错误的平台调用函数以及将无效数据传递给CLR.

我的目标:将UInt32和Byte指针都指向一个bytearray,这样我就可以将Kinect"热图"作为整数和单独颜色读取.我知道我可以轻松地在类型之间进行转换,但由于我正在使用不同格式的多个数组,如果我可以直接访问它们而不必一直在它们之间进行转换会更好.有很多简单的复制正在进行,所以它只会增加开销以保持转换.

Ted*_*sen 6

好的,有趣的故事.事实证明,它不仅可以引用空数组,而且还指向某个地方.这真的搞砸了我的调试.

"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;
   }
}
Run Code Online (Sandbox Code Playgroud)