【转】c#结构体和byte[]之间的转换

    /// <summary>
    /// 结构体转化成byte[]
    /// </summary>
    /// <param name="structure"></param>
    /// <returns></returns>
    public static Byte[] StructToBytes(Object structure)
    {
        Int32 size = Marshal.SizeOf(structure);
        IntPtr buffer = Marshal.AllocHGlobal(size);
        try
        {
            Marshal.StructureToPtr(structure, buffer, false);
            Byte[] bytes = new Byte[size];
            Marshal.Copy(buffer, bytes, 0, size);

            return bytes;
        }
        finally
        {
            Marshal.FreeHGlobal(buffer);
        }
    }
    /// <summary>
    /// byte[]转化成结构体
    /// </summary>
    /// <param name="bytes"></param>
    /// <param name="strcutType"></param>
    /// <returns></returns>
    public static Object BytesToStruct(Byte[] bytes, Type strcutType)
    {
        Int32 size = Marshal.SizeOf(strcutType);
        IntPtr buffer = Marshal.AllocHGlobal(size);
        try
        {
            Marshal.Copy(bytes, 0, buffer, size);

            return Marshal.PtrToStructure(buffer, strcutType);
        }
        finally
        {
            Marshal.FreeHGlobal(buffer);
        }
    }

这个两个函数实现了byte[]数组和结构体之间的转化。可以在通信的时候直接发送和接收结构体。
像如下调用即可
PlatCellMsg pcm = (PlatCellMsg)BytesToStruct(buf, typeof(PlatCellMsg));
byte[] s = StructToBytes(pcm );
不过定义结构体事需要注意一下两点:

结构体中有固定长度的字符串或者byte时:
需要用到MarshalAs;如下
public struct PlatCellMsg
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public char[] fDevName;
public short fcams;
public short fIOin;
public short fIOOut;
private short Fwuyong;
public int fSubCells;
public int fCellId;
}
其中fDevName就定义成了一个32字节长的char[]。

定义结构体的长度
如上结构体占32+2+2+2+2+4+4=48字节,对应的byte[]长度也应该是48.
但是如上的结构体定义成这样它的长度变成了52:
public struct PlatCellMsg
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public char[] fDevName;
public short fcams;
public short fIOin;
public short fIOOut;
public int fSubCells;
public int fCellId;
private short Fwuyong;
}
只是把顺序调换了一下。但是它的长度真变成了52,不知道为什么,但是猜了下,大概是32位应用程序,它一次是处理是4字节
在处理下面结构体时就成了下面这样算了,32+(2+2)+(2+2)+4+4+(2+2)=52其中这连个2是由于在处理前面数据时有富余,但是又没法把后面的数据一块儿处理,就多占用两个字节。
哈哈没正儿八经学过计算机,就这么理解了。
最后需要添加引用:using System.Runtime.InteropServices;

发布了5 篇原创文章 · 获赞 33 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/shenaisi/article/details/104587489
今日推荐