C#結構體和位元組陣列的轉換

iDotNetSpace發表於2009-08-10

在寫C#TCP通訊程式時,傳送資料時,只能傳送byte陣列,處理起來比較麻煩不說,如果是和VC6.0等寫的程式通訊的話,很多的都是傳送結構體,在VC6.0中可以很方便的把一個char[]陣列轉換為一個結構體,而在C#卻不能直接把byte陣列轉換為結構體,要在C#中傳送結構體,可以按以下方法實現: 
1)定義結構體:
    //名稱空間
    using System.Runtime.InteropServices;

//注意這個屬性不能少
    [StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]
    struct TestStruct
    {
        public int c;
        //字串,SizeConst為字串的最大長度
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        public string str;
        //int陣列,SizeConst表示陣列的個數,在轉換成
        //byte陣列前必須先初始化陣列,再使用,初始化
        //的陣列長度必須和SizeConst一致,例test = new int[6];
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
        public int[] test;
    }

2)結構體轉byte陣列:
        ////


        /// 結構體轉byte陣列
        ///
        /// 要轉換的結構體
        /// 轉換後的byte陣列
        public static byte[] StructToBytes(object structObj)
       {
            //得到結構體的大小
            int size = Marshal.SizeOf(structObj);
            //建立byte陣列
            byte[] bytes = new byte[size];
            //分配結構體大小的記憶體空間
            IntPtr structPtr = Marshal.AllocHGlobal(size);
            //將結構體拷到分配好的記憶體空間
            Marshal.StructureToPtr(structObj, structPtr, false);
            //從記憶體空間拷到byte陣列
            Marshal.Copy(structPtr, bytes, 0, size);
            //釋放記憶體空間
            Marshal.FreeHGlobal(structPtr);
            //返回byte陣列
            return bytes;
        }
3byte陣列轉結構體:
        ///
        /// byte陣列轉結構體
        ///
        /// byte陣列
        /// 結構體型別
        /// 轉換後的結構體
        public static object BytesToStuct(byte[] bytes,Type type)
        {
            //得到結構體的大小
            int size = Marshal.SizeOf(type);
            //byte陣列長度小於結構體的大小
            if (size > bytes.Length)
            {
                //返回空
                return null;
            }
            //分配結構體大小的記憶體空間
            IntPtr structPtr = Marshal.AllocHGlobal(size);
            //byte陣列拷到分配好的記憶體空間
            Marshal.Copy(bytes,0,structPtr,size);
            //將記憶體空間轉換為目標結構體
            object bj = Marshal.PtrToStructure(structPtr, type);
            //釋放記憶體空間
            Marshal.FreeHGlobal(structPtr);
            //返回結構體
            return obj;
        }

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-611756/,如需轉載,請註明出處,否則將追究法律責任。

相關文章