程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中結構體與字節流互相轉換

C#中結構體與字節流互相轉換

編輯:C#入門知識

因為程序必須要和C++開發的程序通信,而通信數據的是結構體的轉化後的字節流,那麼就要求C#能夠順利的將字節流轉換為C#結構體。

 

  1. 定義與C++對應的C#結構體

     

    \\代碼
    //C++結構體
    struct tagCheakUser
    {
    char userName[12];
    char pwd[32];
    }



    //對應的C#結構體
    [StructLayout( LayoutKind.Sequential,Pack=1)]
    public struct CheckUser
    {
    [MarshalAs( UnmanagedType.ByValTStr,SizeConst=12)]
    public string userName;
    [MarshalAs(UnmanagedType .ByValTStr,SizeConst=32)]
    public string pwd;
    }

     


    在C++的頭文件定義中,使用了 #pragma pack 1 字節按1對齊,所以C#的結構體也必須要加上對應的特性,LayoutKind.Sequential屬性讓結構體在導出到非托管內存時按出現的順序依次布局,而對於C++的char數組類型,C#中可以直接使用string來對應,當然了,也要加上封送的特性和長度限制。
  2. 結構體與byte[]的互相轉換

     

    \\代碼
    //convert structure T to byte[] 
    public static byte[] ConvertStructToBytes(object objStruct)
    {
    //get the size of structure
    int size = Marshal.SizeOf(objStruct);
    //define buffer arrays
    byte[] buffer = new byte[size];
    //Alloc unmanaged memory and Copy structure to unmanaged memory
    IntPtr ipStruct = Marshal.AllocHGlobal(size);
    Marshal.StructureToPtr(objStruct, ipStruct, false);
    //Copy to the byte array
    Marshal.Copy(ipStruct, buffer, 0, size);
    //Free unmanaged memory
    Marshal.FreeHGlobal(ipStruct);
    return buffer;
    }

    //convert byte array to sturcture
    public static TR ConvertBytesToSturct<TR>(byte[] datas)
    {
    //get size of sturcture
    int size = Marshal.SizeOf(typeof(TR));
    //can not be convert
    if (datas.Length < size)
    {
    return
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved