如何在C#中将IntPtr转换为字节数组?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C#中将IntPtr转换为字节数组?相关的知识,希望对你有一定的参考价值。

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

答案

请看一下: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)获得正确的大小

UPDATE:抱歉,我只是想知道这种方法不需要指针也可以做到,并且由于只有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));
    }

以上是关于如何在C#中将IntPtr转换为字节数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在c ++中将int数组转换为字节数组[重复]

如何在php中将字节数组转换为整数?

如何在c ++中将数组字节转换为字符串?

如何在C ++中将字节数组中的整数转换为数字

如何在 Windows 8 中将字节数组转换为 InMemoryRandomAccessStream 或 IRandomAccessStream

如何在 C 中将字节数组转换为十六进制字符串?