早期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不见了