本文主要起源於專案從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 中傳送結構體,...