【轉】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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章