C# byte[]、struct、intptr、byte[]和byte*等的相互转换

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();
}

其他请参考

https://www.cnblogs.com/jhlong/p/5715015.html

https://www.cnblogs.com/castor-xu/p/14719493.html

相关推荐
future_studio1 小时前
聊聊 Unity(小白专享、C# 小程序 之 图片播放器)
unity·小程序·c#
c#上位机7 小时前
wpf中Grid的MouseDown 事件无法触发的原因
c#·wpf
CodeCraft Studio8 小时前
国产化PDF处理控件Spire.PDF教程:如何在 C# 中从 HTML 和 PDF 模板生成 PDF
pdf·c#·html·.net·spire.pdf·pdf文档开发·html创建模板pdf
ysdysyn10 小时前
.NET 10深度解析:性能革新与开发生态的全新篇章
c#·.net
L X..13 小时前
Unity 光照贴图异常修复笔记
unity·c#·游戏引擎
reasonsummer14 小时前
【办公类-115-06】20250920职称资料上传04——docx复制、docx转PDF(课程表11个)
开发语言·windows·python·c#
William_cl1 天前
一、前置基础(MVC学习前提)_核心特性_【C# 泛型入门】为什么说 List<T>是程序员的 “万能收纳盒“?避坑指南在此
学习·c#·mvc
c#上位机1 天前
wpf之命令
c#·wpf
曹牧2 天前
C#:函数默认参数
开发语言·c#
R-G-B2 天前
【02】C#入门到精通——C# 变量、输入/输出、类型转换
开发语言·c#·c# 变量·c#输入/输出·c#类型转换