C#結構體和位元組陣列的轉換
在寫C#TCP通訊程式時,傳送資料時,只能傳送byte陣列,處理起來比較麻煩不說,如果是和VC6.0等寫的程式通訊的話,很多的都是傳送結構體,在VC6.0中可以很方便的把一個char[]陣列轉換為一個結構體,而在C#卻不能直接把byte陣列轉換為結構體,要在C#中傳送結構體,可以按以下方法實現:
(1)定義結構體:
//名稱空間
using System.Runtime.InteropServices;
//注意這個屬性不能少
[StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]
struct TestStruct
{
public int c;
//字串,SizeConst為字串的最大長度
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string str;
//int陣列,SizeConst表示陣列的個數,在轉換成
//byte陣列前必須先初始化陣列,再使用,初始化
//的陣列長度必須和SizeConst一致,例test = new int[6];
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public int[] test;
}
(2)結構體轉byte陣列:
////
/// 結構體轉byte陣列
///
/// 要轉換的結構體
///
public static byte[] StructToBytes(object structObj)
{
//得到結構體的大小
int size = Marshal.SizeOf(structObj);
//建立byte陣列
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);
//返回byte陣列
return bytes;
}
(3)byte陣列轉結構體:
///
/// byte陣列轉結構體
///
/// byte陣列
/// 結構體型別
///
public static object BytesToStuct(byte[] bytes,Type type)
{
//得到結構體的大小
int size = Marshal.SizeOf(type);
//byte陣列長度小於結構體的大小
if (size > bytes.Length)
{
//返回空
return null;
}
//分配結構體大小的記憶體空間
IntPtr structPtr = Marshal.AllocHGlobal(size);
//將byte陣列拷到分配好的記憶體空間
Marshal.Copy(bytes,0,structPtr,size);
//將記憶體空間轉換為目標結構體
object bj = Marshal.PtrToStructure(structPtr, type);
//釋放記憶體空間
Marshal.FreeHGlobal(structPtr);
//返回結構體
return obj;
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-611756/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C#位元組陣列與字串轉換C#陣列字串
- C#位元組陣列byte[]和字串string如何互相轉換C#陣列字串
- c# 主機和網路位元組序的轉換 關於網路位元組序和主機位元組序的轉換C#
- byte位元組陣列 轉換成double型別陣列型別
- 位運算實現整數與位元組陣列轉換陣列
- 位元組陣列流陣列
- PHP 陣列轉樹結構/樹結構轉陣列PHP陣列
- java 位元組陣列取反Java陣列
- C# 位元組陣列位操作C#陣列
- .NET刪除位元組陣列中的0位元組陣列
- C# 將Byte[]位元組陣列存入 sqlite 資料庫C#陣列SQLite資料庫
- 陣列和集合的相互轉換陣列
- 字串和陣列的相互轉換字串陣列
- AES位元組陣列加密解密流程陣列加密解密
- 關於位元組陣列QByteArray陣列
- 位元組編碼轉換
- javascript字串和陣列轉換JavaScript字串陣列
- 陣列和列表的轉換問題陣列
- iOS字串和陣列的相互轉換iOS字串陣列
- C# string byte陣列轉換解析C#陣列
- C# byte陣列與Image相互轉換的方法C#陣列
- 使用Apache的Hex類實現Hex(16進位制字串和)和位元組陣列的互轉Apache字串陣列
- 陣列結構之陣列陣列
- 從 unicode 到位元組的轉換Unicode
- javascript中字串和陣列的相互轉換JavaScript字串陣列
- Java陣列物件佔用多少個位元組?Java陣列物件
- C# 列舉遍歷和轉換C#
- PHP陣列轉換為js陣列PHP陣列JS
- Java實現普通二維陣列和稀疏陣列的相互轉換Java陣列
- C# 一維陣列如何快速實現陣列元素的資料型別的轉換?C#陣列資料型別
- 字串陣列轉為樹形結構字串陣列
- 玩轉資料結構之陣列資料結構陣列
- C/C++ 結構體位元組對齊詳解C++結構體
- js實現的字串和陣列的相互轉換JS字串陣列
- 結構體最後的零長度陣列結構體陣列
- c#列舉轉換C#
- 資料結構和演算法面試題系列—C指標、陣列和結構體資料結構演算法面試題指標陣列結構體
- 第五篇:主機位元組序與網路位元組序的轉換