using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.io;
using system.runtime.interopservices;
namespace filesendclient
[structlayoutattribute(layoutkind.sequential, charset = charset.ansi, pack = 1)]
struct structdemo
public byte a;
public byte c;
[marshalas(unmanagedtype.byvalarray, sizeconst = 3)]
public byte b;
public byte d;
public int e;
unsafe class program
static void main(string args)
structdemo sd;
sd.a = 0;
sd.d = 0;
sd.c = 0;
sd.b = new byte[3] ;
sd.e = 5;
int size = 0;
//此處使用非安全**來獲取到structdemo的值
unsafe
size = marshal.sizeof(sd);
byte b = structtobytes(sd,size);
bytetostruct(b, typeof(structdemo));
//將byte轉換為結構體型別
public static byte structtobytes(object structobj,int size)
structdemo sd;
int num = 2;
byte bytes = new byte[size];
intptr structptr = marshal.allochglobal(size);
//將結構體拷到分配好的記憶體空間
marshal.structuretoptr(structobj, structptr, false);
//從記憶體空間拷貝到byte 陣列
marshal.copy(structptr, bytes, 0, size);
//釋放記憶體空間
marshal.freehglobal(structptr);
return bytes;
//將byte轉換為結構體型別
public static object bytetostruct(byte bytes, type type)
int size = marshal.sizeof(type);
if (size > bytes.length)
return null;
//分配結構體記憶體空間
intptr structptr = marshal.allochglobal(size);
//將byte陣列拷貝到分配好的記憶體空間
marshal.copy(bytes, 0, structptr, size);
//將記憶體空間轉換為目標結構體
object obj = marshal.ptrtostructure(structptr, type);
//釋放記憶體空間
marshal.freehglobal(structptr);
return obj;
C 中結構體占位元組數(sizeof)
首先看一段 struct xsrt int main 輸出為 sizeof srt 16 sizeof srt.a 1 sizeof srt.b 4 sizeof srt.c 8 出現這種情況的原因是記憶體位元組對齊導致 當然 這裡記住兩個原則就可以將這個問題搞清楚 第一 結構體中的元素是按照順序乙...
c 中關於結構體和位元組陣列轉化
最近在使用結構體與位元組陣列轉化來實現socket間資料傳輸。現在開始整理一下。對於marshal可以查閱msdn,關於位元組陣列與結構體轉 如下 usingsystem usingsystem.collections.generic usingsystem.linq usingsystem.tex...
C 中結構體和位元組陣列轉換實現
using system using system.collections.generic using system.linq using system.text us程式設計客棧ing system.io using system.runtime.interopservices namespace...