将Structure 直接转成二进制

早期C++等写的程序,为了传输和存储的结构比较简单,会使用固定二进制的方式来存储数据。 这样如果我们存储的数据是有序的情况下,我们也可以很方便使用折半查找法来快速的寻找数据。 在C#当中我们也可以直接用 Structure来方便的处理。

public class BinaryHelper
    {
        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);
            }

        }

        public static object BytesToStruct(byte[] bytes, Type strcutType)
        {
            int 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);
            }
        }
    }

使用

//定义一下Data
public struct MalemaData
    {
        public byte B;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public byte[] Ba;
        public int I;
        [MarshalAs(UnmanagedType.ByValTStr,SizeConst = 10)]
        public string Name;
    }

var data = new MalemaData() { B = 1, Ba = new byte[] { 11, 12, 13, 14 }, I = 9999, Name = "malemaabcdefghi" };
var bytes = BinaryHelper.StructToBytes(data);

var o = BinaryHelper.BytesToStruct(bytes, typeof(MalemaData));
var myData = (MalemaData)o;
Console.WriteLine(myData.Name); //我们会发现这个是 malemaabc  因为我们上面的SizeConst是10个。
//Ba实际也是只有 11 12 13, 14不见了
下一篇:csv简介
最近更新的
...