在網絡傳輸數據或將其存儲在二進製文件中時,通常需要將結構體轉換為字節數組。結構體是值類型,包含多個相關的數 據元素,而字節數組是連續的二進制數據塊。
考慮以下表示CIFS(通用互聯網文件系統)數據包的C#結構體:
<code class="language-csharp">public struct CIFSPacket { // ... various fields ... public string Buffer; }</code>
要將結構體轉換為字節數組,可以使用Marshal類的StructToPtr方法。此方法接受兩個參數:
以下是一個將CIFSPacket結構體轉換為字節數組的函數:
<code class="language-csharp">public static byte[] getBytes(CIFSPacket str) { int size = Marshal.SizeOf(str); byte[] arr = new byte[size]; IntPtr ptr = IntPtr.Zero; try { ptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(str, ptr, true); Marshal.Copy(ptr, arr, 0, size); } finally { Marshal.FreeHGlobal(ptr); } return arr; }</code>
要正確編組字符串,我們需要使用MarshalAs屬性。例如,如果我們的Buffer字段是字符串,我們可以將其註釋如下:
<code class="language-csharp">[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] public string Buffer;</code>
此屬性指示應將字符串編組為固定長度的、以null結尾的字符串,最大大小為100個字符。
一旦我們有了結構體的字節數組表示,就可以使用Marshal類的PtrToStructure方法恢復結構體。此方法接受兩個參數:
以下是一個將字節數組轉換回CIFSPacket結構體的函數:
<code class="language-csharp">public static CIFSPacket fromBytes(byte[] arr) { CIFSPacket str = new CIFSPacket(); int size = Marshal.SizeOf(str); IntPtr ptr = IntPtr.Zero; try { ptr = Marshal.AllocHGlobal(size); Marshal.Copy(arr, 0, ptr, size); str = (CIFSPacket)Marshal.PtrToStructure(ptr, str.GetType()); } finally { Marshal.FreeHGlobal(ptr); } return str; }</code>
要使用這些函數,只需將CIFSPacket結構體傳遞給getBytes函數即可獲得其字節數組表示。或者,您可以將字節數組傳遞給fromBytes函數以重新創建原始結構體。
通過利用編組技術,我們可以輕鬆地將結構體轉換為字節數組,並反向轉換,從而實現高效的數據傳輸和存儲。
以上是如何使用編制將c#結構轉換為字節陣列和從字節陣列轉換?的詳細內容。更多資訊請關注PHP中文網其他相關文章!