2011-01-30 68 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; 
    } 
}