c 拷貝結構體 C 中結構體和位元組陣列轉換實現

2021-10-17 06:27:21 字數 1808 閱讀 4185

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...