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

2021-06-01 20:02:48 字數 1732 閱讀 7624

本文主要起源於專案從c++轉到c#時碰到的問題,即套接字傳送資訊時的型別轉換。

在c++中,套接字傳送和接收的型別為字元陣列char,而char與結構體struct可以直接進行顯式轉換就可以;

在c#中,sockets類和networkstream類傳送和接收的型別為位元組陣列byte,而它與結構體的轉換並不是非常方便,因此也就有了下文

知識儲備:

(1) 需要用到marshal類,該類提供了乙個方法集,這些方法用於分配非託管記憶體、複製非託管記憶體塊、將託管型別轉換為非託管型別,此外還提供了在與非託管**互動時使用的其他雜項方法。

(2) **的輸入和輸出都是託管型別(疑問:結構是值型別,也是託管型別??)

(3) 中間需要用非託管型別作為內容的中轉;

下面是**:

從結構體轉到位元組陣列:

//byte是託管的,structobj是託管的,structptr是非託管的

//從struct轉換到byte

public static byte structtobytes(object structobj)

從位元組陣列轉到結構體(strtype指明了所要轉換的結構體型別):

//返回型別其實沒什麼用,從bytes轉為strtype型別的結構體

//從byte轉換為struct

public static object bytestostruct(byte bytes, type strtype)

//從程序的非託管堆中分配記憶體給structptr

intptr strptr = marshal.allochglobal(size);

//將資料從一維託管陣列bytes複製到非託管記憶體指標strptr

marshal.copy(bytes, 0, strptr, size);

//將資料從非託管記憶體塊封送到新分配的指定型別的託管物件

//將記憶體空間轉換為目標結構體

object obj = marshal.ptrtostructure(strptr, strtype);

//釋放以前使用 allochglobal 從程序的非託管記憶體中分配的記憶體

marshal.freehglobal(strptr);

return obj;

}

從位元組陣列型別轉為結構體型別(返回值從object直接轉為了structtype型別的物件)

//從位元組陣列轉化為結構體

public structtype converbytestostructure(byte bytesbuffer)

//分配乙個未託管型別變數

intptr bufferhandler = marshal.allochglobal(bytesbuffer.length);

//逐個複製,也可以直接用copy()方法

for (int index = 0; index < bytesbuffer.length; index++)

//從非託管型別轉化為託管型別變數

structtype structobject = (structtype)marshal.ptrtostructure(bufferhandler, typeof(structtype));

//釋放非託管型別變數

marshal.freehglobal(bufferhandler);

return structobject;

}

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

c 結構體和位元組陣列的轉換 在寫c tcp通訊程式時,傳送資料時,只能傳送byte陣列,處理起來比較麻煩不說,如果是和vc6.0等寫的程式通訊的話,很多的都是傳送結構體,在vc6.0中可以很方便的把乙個char陣列轉換為乙個結構體,而在c 卻不能直接把byte陣列轉換為結構體,要在c 中傳送結構體...

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

轉 在寫c tcp通訊程式時,傳送資料時,只能傳送byte陣列,處理起來比較麻煩不說,如果是和vc6.0等寫的程式通訊的話,很多的都是傳送結構體,在vc6.0 中可以很方便的把乙個char陣列轉換為乙個結構體,而在c 卻不能直接把byte陣列轉換為結構體,要在c 中傳送結構體,可以按以下方法實現 1...

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

在寫 c tcp 通訊程式時,傳送資料時,只能傳送 byte 陣列,處理起來比較麻煩不說,如果是和 vc6.0 等寫的程式通訊的話,很多的都是傳送結構體,在 vc6.0 中可以很方便的把乙個 char 陣列轉換為乙個結構體,而在 c 卻不能直接把 byte 陣列轉換為結構體,要在 c 中傳送結構體,...