struct、byte[]互相转换
cs
//struct转换为byte[]
public static byte[] StructToBytes(object structObj)
{
int size = Marshal.SizeOf(structObj);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.StructureToPtr(structObj, buffer, false);
byte[] bytes = new byte[size];
Marshal.Copy(buffer, bytes, 0, size);
return bytes;
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}
//byte[]转换为struct
public static object BytesToStruct(byte[] bytes, Type type)
{
int size = Marshal.SizeOf(type);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(bytes, 0, buffer, size);
return Marshal.PtrToStructure(buffer, type);
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}
Intptr、byte[]互相转换
cs
//IntPtr转byte[]
IntPtr y=new IntPtr();
byte[] ys = new byte[yLength];
Marshal.Copy(y, ys, 0, yLength);
//IntPtr转byte[]
private byte[] IntPtrToByte(IntPtr unmanagedMemory, int dataSize)
{
byte[] managedArray = new byte[dataSize];
try
{
// 复制托管数组的内容到非托管内存
Marshal.Copy(managedArray, 0, unmanagedMemory, managedArray.Length);
}
catch (Exception ex)
{
// 处理任何异常,比如内存不足等
Console.WriteLine($"Error: {ex.Message}");
return managedArray;
}
return managedArray;
}
//byte[]转换为Intptr
public static Intptr BytesToIntptr(byte[] bytes)
{
int size = bytes.Length;
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(bytes, 0, buffer, size);
return buffer;
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}
//输入byte[],返回IntPtr ,不使用Marshal创建新的堆,节省内存开销,也避免忘记释放导致的问题
private IntPtr ArrToPtr(byte[] array)
{
return System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(array, 0);
}
byte[]、byte*互相转换
cs
//从byte*转byte[]
byte[] barr = new byte[10];
byte* bp = (byte*)Marshal.AllocHGlobal(10);
for (int i = 0; i < 10; i++)
bp[i] = (byte)i;
Marshal.Copy((IntPtr)bp, barr, 0, 10);
PrintArray(barr);
Marshal.FreeHGlobal((IntPtr)bp);
//从byte[]到byte*
byte[] barr = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
byte* bp = (byte*)Marshal.AllocHGlobal(5);
PrintPtr(bp, 5);
Marshal.Copy(barr, 3, (IntPtr)bp, 5);
PrintPtr(bp, 5);
Marshal.FreeHGlobal((IntPtr)bp);
static void PrintPtr(byte* bp,int n)
{
for(int i=0;i<n;++i)
Console.Write(bp[i] + " ");
Console.WriteLine();
}
其他请参考