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 );
不过定义结构体事需要注意一下两点:

  1. 结构体中有固定长度的字符串或者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[]。

  2. 定义结构体的长度
    如上结构体占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;

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值