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

2021-07-01 20:18:52 字數 1449 閱讀 3680

在通訊過程中,一般我們都會操作到位元組陣列.特別是希望在不同語言程式設計進行操作的時候.

雖然c#提供了序列化的支援,不用位元組陣列也行.但操作位元組陣列肯定會碰到.

一般都會採用結構來表示位元組陣列.但結構與位元組陣列直接的轉換實在很麻煩.

位元組操作不但容易出錯,而且每增加乙個結構,就自己實現一遍,實在是煩不勝煩.

有沒有簡單的方法呢?當然有.可以採用非託管區的一些方法來實現.

首先,匯入命名空間:system.runtime.interopservices;

定義結構的時候,要給結構指定特性.

如: //注意這個特性不能少

[structlayoutattribute(layoutkind.sequential, charset = charset.ansi, pack = 1)]

struct teststruct  

你可以修改特性的屬性,來更改在記憶體的布局和排列.

好,接下來將結果轉換為位元組資料.為了支援各種結構,我採用泛型的做法.這樣編譯器可以幫助我們檢查型別是否正確.

////// 結構體轉byte陣列

////// 要轉換的結構體

/// 轉換後的byte陣列

public static byte structtobytes(t structobj)where t:struct  

將位元組陣列轉換為指定結構

////// byte陣列轉結構體

////// byte陣列

/// 轉換後的結構體

public static t bytestostuct(byte bytes)where t:struct  

//分配結構體大小的記憶體空間

intptr structptr = marshal.allochglobal(size);

//將byte陣列拷到分配好的記憶體空間

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

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

object obj = marshal.ptrtostructure(structptr, type.gettype ());

//釋放記憶體空間

marshal.freehglobal(structptr);

//返回結構體

return (t)obj;  }

雖然我對t型別進行了限制,但如果結構沒有指定特性的話,執行不會出現問題,但邏輯可能會出現一些問題,出現了你不想要的結果.這是必須注意的.

那怎麼使用這些**呢?

public static void testc()  ;

byte data = structtobytes(t);

foreach (var item in data)  

teststruct tm = bytestostuct(data);

console.writeline("c: str=",tm.c,tm.str );

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

在通訊過程中,一般我們都會操作到位元組陣列.特別是希望在不同語言程式設計進行操作的時候.雖然c 提供了序列化的支援,不用位元組陣列也行.但操作位元組陣列肯定會碰到.一般都會採用結構來表示位元組陣列.但結構與位元組陣列直接的轉換實在很麻煩.位元組操作不但容易出錯,而且每增加乙個結構,就自己實現一遍,實...

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

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

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

本文主要起源於專案從c 轉到c 時碰到的問題,即套接字傳送資訊時的型別轉換。在c 中,套接字傳送和接收的型別為字元陣列char,而char與結構體struct可以直接進行顯式轉換就可以 在c 中,sockets類和networkstream類傳送和接收的型別為位元組陣列byte,而它與結構體的轉換並...