c Marshal 將位元組陣列轉為結構 封裝協議

2022-06-16 16:45:10 字數 1071 閱讀 5574

定義需要轉換的結構體

需要讓結構體資料順序排列並對齊

依次定義每乙個屬性的長度即可,需要注意定義的資料型別的大小要與unmanagedtype型別定義的大小一直

否則會報 「不能作為非託管結構進行封送處理;無法計算有意義的大小或偏移量」

// [structlayout(layoutkind.sequential, pack = 1)] //順序排列,並按1位元組對齊 

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

public struct seg2

將位元組陣列轉為物件

var filebyte = file.readallbytes(testfile);

//建立指定型別的指標(從程序的非託管記憶體中分配記憶體)

intptr paramptr = marshal.allochglobal(marshal.sizeof(typeof(seg2)));

//將位元組陣列複製到指標

marshal.copy(filebyte, 0, paramptr, marshal.sizeof(typeof(seg2)));

////將指定的指標轉為特定型別的物件(將資料從非託管記憶體塊封送到新分配的指定型別的託管物件)

seg2 obj = (seg2)marshal.ptrtostructure(paramptr, typeof(seg2));

將物件從託管物件複製到記憶體塊

//將物件複製給指標所指記憶體

var obj=new object();

marshal.structuretoptr(obj, paramptr, true);

marshal.freehglobal(paramptr);
複雜物件

如果為陣列這類非固定位數的物件,可以通過多次呼叫的方式依次將託管物件與非託管物件互相轉換

形式上更像c/c++利用指針對記憶體進行操作

unity AssetBundle位元組陣列加密

1.加密 對assetbundle的位元組陣列每位進行與key的異或處理 相同為0,不同為1 using system using system.collections.generic using system.io using system.linq using system.text names...

位元組陣列bytearray()

序列 常見的序列有 list,tuple,str,bytes,bytearray 位元組串 bytes,位元組陣列bytearray是二進位制資料組成的序列,其中每個元素8bit二進位制組成 位元組陣列bytearray 可變的位元組序列,相當於bytes的可變版本 建立bytearray物件的方法...

位元組陣列 Byte

位元組 byte 發音 bait 位元組是通過網路傳輸資訊 或在硬碟或記憶體中儲存資訊 的單位。在ascii碼中,乙個英文本母 不分大小寫 佔乙個位元組的空間,乙個中文漢字佔兩個位元組的空間。符號 英文標點佔乙個位元組,中文標點佔兩個位元組。舉例 英文句號 佔1個位元組的大小,中文句號 佔2個位元組...