【问题标题】:Unsafe Int32 pointer to a Byte[] array指向 Byte[] 数组的不安全 Int32 指针
【发布时间】:2011-01-30 13:04:59
【问题描述】:

我有一个字节数组,我想通过 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“热图”读取为整数和单独的颜色。我知道我可以轻松地在类型之间进行转换,但是由于我正在使用不同格式的多个数组,所以如果我可以直接访问它们而不总是在它们之间进行转换会更好。有很多简单的复制正在进行,所以它只会增加开销来继续转换。

【问题讨论】:

  • bgImageBytes 真的是new byte[1000] 吗?还是将其传递给非托管代码?
  • 刚刚测试过:byte[] a = new byte[100];固定 (byte* b = a) { Int32* c = (Int32*)b; c[0] = 1000; } 在 .NET 4 上适用于我。也适用于 UInt32。你用的是什么版本?是实际代码吗?
  • 它纯粹是根据一些计算来管理和初始化为图像的大小(所以1000实际上更像是stride+heightwidthcolordepth,但这无关紧要)。
  • 也许你应该多贴一点代码,很难看出实际发生了什么

标签: c# pointers


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    相关资源
    最近更新 更多