请看:
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) 获得正确的大小
更新:
抱歉,我只是想这可能会做同样的事情,不需要指针,因为只有 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));
}