【问题标题】:How to convert an IntPtr to byte array in c#?如何在 C# 中将 IntPtr 转换为字节数组?
【发布时间】:2020-05-13 19:37:21
【问题描述】:

我需要将数据从项目的第一部分(用 C# 编写)发送到用 C++ 编写的第二部分。为此,我需要了解如何将字节数组转换为 IntPtr。

【问题讨论】:

  • 只需在[DllImport]声明中将参数声明为byte[]即可。 pinvoke marshaller 负责固定数组并将指针传递给数组的第一个元素,以便本机代码可以安全地访问数据。
  • 所以,在标题中您想从 IntPtr 转换为字节数组,但在从字节数组到 IntPtr 的问题中?还是您实际上需要字节数组中的 IntPtr 来在 C++ 部分中引用它?

标签: .net


【解决方案1】:

请看:
MarshalStackalloc

我认为没有原生的“方法”,但这应该可行:

    public unsafe static byte[] IntPtrToArray(IntPtr input)
    {
        IntPtr* ptr = stackalloc IntPtr[1];
        *ptr = input;
        byte[] output = new byte[sizeof(IntPtr)];
        Marshal.Copy((IntPtr)ptr, output, 0, sizeof(IntPtr));
        return output;
    }

请注意,您需要添加 unsafe 关键字并使用 unsafe-compiler-option
您需要启用指针使用的选项,您可以在 Visual Studio 中像这样激活它:

  1. 右键单击您的项目
  2. 选择“属性”
  3. 在项目属性窗口中选择“构建”
  4. 在“常规”下选中“允许不安全代码”

如果你想将它们转换回来,这应该可以:

    public unsafe static IntPtr ArrayToIntPtr(byte[] input)
    {
        IntPtr* ptr = stackalloc IntPtr[1];
        Marshal.Copy(input, 0, (IntPtr) ptr, sizeof(IntPtr));
        return *ptr;
    }

例子:

    public unsafe static void Main(string[] args)
    {
        var v1 = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
        var r1 = ArrayToIntPtr(v1);
        Console.WriteLine(r1);
        var r2 = IntPtrToArray(r1);
        Console.WriteLine(string.Join(',', r2));
        Console.ReadLine();
    }

输出:

578437695752307201
1,2,3,4,5,6,7,8

还请注意IntPtr 的大小是特定于平台的,因此您需要提供正确大小的byte[],正如您在我的代码中看到的那样,您可以使用sizeof(IntPtr) 获得正确的大小

更新
抱歉,我只是想这可能会做同样的事情,不需要指针,因为只有 32 位和 64 位,它也应该在所有机器上运行:

    public unsafe static byte[] IntPtrToArray2(IntPtr input)
    {
        return sizeof(IntPtr) == 4 ? BitConverter.GetBytes((int)input) : BitConverter.GetBytes((long)input);
    }
    public unsafe static IntPtr ArrayToIntPtr2(byte[] input)
    {
        return (IntPtr)(sizeof(IntPtr) == 4 ? BitConverter.ToInt32(input) : BitConverter.ToInt32(input));
    }

【讨论】:

  • 我刚刚注意到我弄错了...等一下:D
  • 它如何帮助我将字节数组转换为 intptr?
  • 嗨,我希望现在更明显了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多