C#通過TCP傳送結構體

來源:互聯網
上載者:User

       在寫C#TCP通訊程式時,發送資料時,只能發送byte數組,處理起來比較麻煩不說,如果是和VC6.0等寫的程式通訊的話,很多的都是傳送結構體,在VC6.0中可以很方便的把一個char[]數群組轉換為一個結構體,而在C#卻不能直接把byte數群組轉換為結構體,要在C#中發送結構體,可以按以下方法實現:

1)定義結構體:

  1.  //命名空間
  2. using System.Runtime.InteropServices;
  3.     //注意這個屬性不能少
  4.      [StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]
  5.     struct TestStruct
  6.     {
  7.         public int c;
  8.         //字串,SizeConst為字串的最大長度
  9.          [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
  10.         public string str;
  11.         //int數組,SizeConst表示數組的個數,在轉換成
  12.         //byte數組前必須先初始化數組,再使用,初始化
  13.         //的數組長度必須和SizeConst一致,例test = new int[6];
  14.          [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
  15.         public int[] test;
  16.      }

 

2)結構體轉byte數組:

  1.         //// <summary>
  2.         /// 結構體轉byte數組
  3.         /// </summary>
  4.         /// <param name="structObj">要轉換的結構體</param>
  5.         /// <returns>轉換後的byte數組</returns>
  6.         public static byte[] StructToBytes(object structObj)
  7.         {
  8.             //得到結構體的大小
  9.             int size = Marshal.SizeOf(structObj);
  10.             //建立byte數組
  11.             byte[] bytes = new byte[size];
  12.             //分配結構體大小的記憶體空間
  13.              IntPtr structPtr = Marshal.AllocHGlobal(size);
  14.             //將結構體拷到分配好的記憶體空間
  15.              Marshal.StructureToPtr(structObj, structPtr, false);
  16.             //從記憶體空間拷到byte數組
  17.              Marshal.Copy(structPtr, bytes, 0, size);
  18.             //釋放記憶體空間
  19.              Marshal.FreeHGlobal(structPtr);
  20.             //返回byte數組
  21.             return bytes;
  22.          }

3)byte數組轉結構體:

 

  1.         /// <summary>
  2.         /// byte數組轉結構體
  3.         /// </summary>
  4.         /// <param name="bytes">byte數組</param>
  5.         /// <param name="type">結構體類型</param>
  6.         /// <returns>轉換後的結構體</returns>
  7.         public static object BytesToStuct(byte[] bytes,Type type)
  8.         {
  9.             //得到結構體的大小
  10.             int size = Marshal.SizeOf(type);
  11.             //byte數組長度小於結構體的大小
  12.             if (size > bytes.Length)
  13.             {
  14.                 //返回空
  15.                 return null;
  16.              }
  17.             //分配結構體大小的記憶體空間
  18.              IntPtr structPtr = Marshal.AllocHGlobal(size);
  19.             //將byte數組拷到分配好的記憶體空間
  20.              Marshal.Copy(bytes,0,structPtr,size);
  21.             //將記憶體空間轉換為目標結構體
  22.             object obj = Marshal.PtrToStructure(structPtr, type);
  23.             //釋放記憶體空間
  24.              Marshal.FreeHGlobal(structPtr);
  25.             //返回結構體
  26.             return obj;
  27.          }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.