如何在C#中将IntPtr转换为字节数组?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C#中将IntPtr转换为字节数组?相关的知识,希望对你有一定的参考价值。
我需要将数据从项目的第一部分(即用C#编写的数据发送到第二部分,即用C ++编写的数据)发送。为此,我需要了解如何将字节数组转换为IntPtr。
答案
请看一下:Marshal和Stackalloc
我认为没有本地的“方法”,但这应该可以工作:
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中像这样激活它:
- 右键单击您的项目
- 选择“属性”
- 在项目属性窗口中选择“构建”
- 在“常规”下选中“允许不安全的代码”
并且如果您想将它们转换回去,这应该可行:
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转换为字节数组?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 8 中将字节数组转换为 InMemoryRandomAccessStream 或 IRandomAccessStream