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

4

我有一个字节数组,我想通过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指针,以便我可以将Kinect“heatmap”作为整数和单个颜色读取。我知道我可以轻松地在类型之间进行转换,但由于我正在使用不同格式的多个数组,因此最好能够直接访问它们,而无需一直在它们之间进行转换。有很多简单的复制操作,因此保持转换只会增加开销。

bgImageBytes实际上是new byte[1000]吗?还是它被传递给了非托管代码? - Marlon
刚刚测试了一下:byte[] a = new byte[100]; fixed (byte* b = a) { Int32* c = (Int32*)b; c[0] = 1000; } 在我的 .NET 4 上可以运行。UInt32 也是如此。你用的是哪个版本?这是实际的代码吗? - Mehrdad Afshari
它是纯管理的,根据一些计算初始化为图像大小(因此1000实际上更像是stride+heightwidthcolordepth,但这并不重要)。 - Tedd Hansen
也许你应该发布更多的代码,这样才能更清楚地看到实际发生了什么。 - Marlon
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接