客戶端採用c++開發,服務端採用c#開發,所以雙方必須保證各自定義結構體成員型別和長度一致才能保證報文解析的正確性.
[structlayoutattribute(layoutkind.sequential, charset = charset.ansi, pack = 1一、首先是 [structlayoutattribute(layoutkind.sequential, charset = charset.ansi, pack = 1)],這是c#引用非託管的c/c++的dll的一種定義定義結構體的方式,主要是為了記憶體中排序,layoutkind有兩個屬性sequential和explicit,sequential表示順序儲存,結構體內資料在記憶體中都是順序存放的,charset=charset.ansi表示編碼方式。這都是為了使用非託管的指標準備的,這兩點大家記住就可以。)]
public
struct
head
需要注意的是 pack = 1 這個特性,它代表了結構體的位元組對齊方式,在實際開發中,c++開發環境開始預設是2位元組對齊方式 ,拿上面報文包頭結構體為例,char型別在雖然在記憶體中至占用乙個位元組,但在結構體轉為位元組陣列時,系統會自動補齊兩個位元組,所以如果c#這面定義為pack=1,c++預設為2位元組對齊的話,雙方結構體會出現長度不一致的情況,相互轉換時必然會發生錯位,所以需要大家都預設1位元組對齊的方式,c#定義pack=1,c++ 新增 #pragma pack 1,保證結構體中位元組對齊方式一致。
二、陣列的定義,結構體中每個成員的長度都是需要明確的,因為記憶體需要根據這個分配空間,而c#結構體中陣列是無法進行初始化的,這裡我們需要在成員宣告時進行定義;
/// ///終端資訊查詢上面的**需要注意的是string型別實際為char[6]長度的陣列,實際使用中只能有效的使用前5個字元,因為char[6]最後一位預設\0;/// [structlayoutattribute(layoutkind.sequential, charset = charset.ansi, pack = 1)] public structpackterminalsearch5001 /// ///終端資訊資料 ///
[structlayoutattribute(layoutkind.sequential, charset = charset.ansi, pack = 1)] public structpackterminalsearch3004 /// ///磁碟資訊 /// [structlayoutattribute(layoutkind.sequential, charset = charset.ansi, pack = 1)] public structpackdiskinfo
三、結構體與位元組陣列的互轉
packterminalsearch5001 info;info.stationcode = "12345";
info.order = new byte[6] ;
byte recv = structtobytes(info);
object obj = bytestostuct(recv, typeof(packterminalsearch5001));
packterminalsearch5001 info5001 = (packterminalsearch5001)obj;
byte order = info5001.order;
//// ///結構體轉byte陣列///
/// 要轉換的結構體
/// 轉換後的byte陣列
public static byte structtobytes(objectstructobj) /// ///byte陣列轉結構體 ///
/// byte陣列
/// 結構體型別
/// 轉換後的結構體
public static object bytestostuct(byte bytes, type type) //分配結構體大小的記憶體空間 intptr structptr =marshal.allochglobal(size); //將byte陣列拷到分配好的記憶體空間 marshal.copy(bytes, 0, structptr, size); //將記憶體空間轉換為目標結構體 object obj =marshal.ptrtostructure(structptr, type); //釋放記憶體空間 marshal.freehglobal(structptr); //返回結構體 returnobj; }
C 結構體和位元組陣列的轉換
c 結構體和位元組陣列的轉換 在寫c tcp通訊程式時,傳送資料時,只能傳送byte陣列,處理起來比較麻煩不說,如果是和vc6.0等寫的程式通訊的話,很多的都是傳送結構體,在vc6.0中可以很方便的把乙個char陣列轉換為乙個結構體,而在c 卻不能直接把byte陣列轉換為結構體,要在c 中傳送結構體...
C 結構體和位元組陣列的轉換
本文主要起源於專案從c 轉到c 時碰到的問題,即套接字傳送資訊時的型別轉換。在c 中,套接字傳送和接收的型別為字元陣列char,而char與結構體struct可以直接進行顯式轉換就可以 在c 中,sockets類和networkstream類傳送和接收的型別為位元組陣列byte,而它與結構體的轉換並...
C 結構體和位元組陣列的轉換
轉 在寫c tcp通訊程式時,傳送資料時,只能傳送byte陣列,處理起來比較麻煩不說,如果是和vc6.0等寫的程式通訊的話,很多的都是傳送結構體,在vc6.0 中可以很方便的把乙個char陣列轉換為乙個結構體,而在c 卻不能直接把byte陣列轉換為結構體,要在c 中傳送結構體,可以按以下方法實現 1...