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#位元組陣列byte[]和字串string如何互相轉換C#陣列字串
- 位元組陣列轉浮點數線上轉換器陣列
- float浮點數線上轉位元組陣列轉換工具陣列
- PHP 陣列轉樹結構/樹結構轉陣列PHP陣列
- 位運算實現整數與位元組陣列轉換陣列
- List 和 陣列 的轉換陣列
- 【Java】int[] 陣列 和 Integer陣列的轉換Java陣列
- 位元組陣列流陣列
- 浮點數(float)線上轉位元組陣列的工具陣列
- 陣列和列表的轉換問題陣列
- C# 列舉遍歷和轉換C#
- 轉換協議位元組協議
- 從 unicode 到位元組的轉換Unicode
- PHP陣列轉換為js陣列PHP陣列JS
- C# 一維陣列如何快速實現陣列元素的資料型別的轉換?C#陣列資料型別
- Java實現普通二維陣列和稀疏陣列的相互轉換Java陣列
- AES位元組陣列加密解密流程陣列加密解密
- c#列舉轉換C#
- 字串陣列轉為樹形結構字串陣列
- 玩轉資料結構之陣列資料結構陣列
- JS 將有父子關係的陣列轉換成樹形結構資料JS陣列
- C#資料結構與演算法3-C# 串和陣列C#資料結構演算法陣列
- Golang 陣列和字串之間的相互轉換[]byte/stringGolang陣列字串
- json字串 轉換為陣列JSON字串陣列
- JavaScript 字串轉換為陣列JavaScript字串陣列
- PHP 物件轉換成陣列PHP物件陣列
- 陣列轉換成List集合陣列
- Java陣列物件佔用多少個位元組?Java陣列物件
- 將字串陣列轉換為浮點數陣列字串陣列
- xml與陣列的相互轉換——phpXML陣列PHP
- 資料結構和演算法面試題系列—C指標、陣列和結構體資料結構演算法面試題指標陣列結構體
- 漢字-字母-位元組-位之間的轉換
- 陣列(ArrayPool陣列池、Span<T>結構)陣列
- 資料結構之陣列和矩陣--矩陣&不規則二維陣列資料結構陣列矩陣
- 二維陣列和稀疏陣列互轉陣列
- python以16進位制列印位元組陣列Python陣列
- C++資料結構和pb資料結構的轉換C++資料結構
- C#--得到物件在記憶體中的大小和把記憶體中的位元組轉換為字串C#物件記憶體字串
- string與char陣列相互轉換陣列