在写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;ITPUB个人空间9H]
//int数组,SizeConst表示数组的个数,在转换成
//byte数组前必须先初始化数组,再使用,初始化
//的数组长度必须和SizeConst一致,例test = new int[6];
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public int[] test;
}
(2)结构体转byte数组:
//// <summary>ITPUB个人空间hUH b? X
/// 结构体转byte数组
/// </summary>
/// <param name="structObj">要转换的结构体</param>
/// <returns>转换后的byte数组</returns>
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数组转结构体:
/// <summary>
/// byte数组转结构体
/// </summary>
/// <param name="bytes">byte数组</param>
/// <param name="type">结构体类型</param>
/// <returns>转换后的结构体</returns>
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;
}
分享到:
相关推荐
C#【泛型】实现的【通用】结构体转字节数组,包含网上收集的网页参考资料、非通用的【StructTest】工程、泛型实现的通用【Struct2BytesGenericType】工程。 VS2010编译运行。
反向操作,即从字节数组转换回结构体,可以这样实现: ```csharp public static object BytesToStruct(byte[] bytes, Type type) { int size = Marshal.SizeOf(type); if (size > bytes.Length) return null; ...
总结起来,这个"C#byte数组结构体互相转换示例"提供了C#中结构体与字节数组之间转换的实用方法,解决了开发过程中常见的序列化和反序列化需求,提高了代码效率。开发者可以根据自己的项目需求,直接引用或借鉴这些...
总结来说,C#中的结构体与字节数组转换是通过`Marshal`类提供的方法实现的,这允许我们方便地在结构体对象和字节数组之间进行切换,尤其在需要处理原始字节流的场景中,如网络通信或二进制文件读写。理解并掌握这种...
通过以上介绍和示例代码,我们可以看到如何在C#中实现结构体与字节数组之间的相互转换。这种方法在TCP通信以及其他涉及原始数据传输的应用场景中非常有用。需要注意的是,使用`Marshal`类进行操作可能会导致性能开销...
// 将字节数组转换为结构体 public static MyStruct ByteArrayToStruct(byte[] bytes) { MyStruct myStruct; GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { IntPtr ptr = handle....
最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换;由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性,这一点非常重要...
总之,将C/C++的结构体转换为C#结构体涉及到数据类型的映射、内存对齐、序列化和反序列化等多个方面。通过理解这些关键点,我们可以有效地实现跨语言的网络通信。在实际开发中,还需要注意错误处理和性能优化,确保...
使用了`#pragma pack 1`字节对齐,所以C#的结构体也必须要加上对应的特性,`LayoutKind.Sequential`属性让结构体在导出到非托管内存时按出现的顺序依次布局,而对于C++的char数组类型,C#中可以直接使用string来对应...
总之,理解如何在C#中处理二进制数据和在结构体与字节数组之间转换是提升编程能力的重要一步,这使你能够处理底层数据,实现高效的文件读写、网络通信等功能。通过实践和熟悉相关API,你可以在实际项目中更好地应用...
对于C++中的结构体,可以直接在C#中创建对应的结构体,并且注意使用`MarshalAs`属性来确保正确的内存布局和类型转换。 #### 示例 假设有一个C++结构体如下所示: ```cpp struct Point { int x; int y; }; ``` ...
2、把从数据库读取的byte数组转换为Image对象,赋值给相应的控件显示。 3、从图片byte数组得到对应图片的格式,生成一张图片保存到磁盘上。 这里的Image是System.Drawing.Image。 //Get an image from file Image...
接下来,我们来看如何将Byte数组转换为自定义结构体数组。假设我们有如下结构体: ```csharp [StructLayout(LayoutKind.Sequential)] public struct MyStruct { public int Value1; public float Value2; } ``` ...
在C#编程中,将字节数组转换为易读的字符串通常是处理二进制数据时的常见需求,尤其在解析网络通信协议、文件存储或序列化数据等场景。字节数组通常包含非打印字符或者无法直接识别的二进制数据,而将其转化为可读的...
例如,BitConverter.ToInt32()和BitConverter.GetBytes()分别用于将整数转换为字节数组和将字节数组转换为整数。 7. 十六进制数输出: C#提供了ToString("X")或ToString("x")方法,可以将数值转换为十六进制字符串...
从给定的文件信息来看,标题和描述指向的是关于C语言中结构体(struct)与指针(pointer)之间的交互操作,以及结构体与字节数组、字符串处理的详细解释。然而,部分代码示例似乎来自不同的编程环境,如C#、C++和...
10. 结构体和字节数组:在处理二进制数据时,定义结构体来匹配数据格式,然后使用`Marshal.Copy`或`Buffer.BlockCopy`方法复制字节数组到结构体,反之亦然。 通过Visual Studio 2012,你可以创建一个简单的`Console...
在上面的代码中,我们首先将数组指针转换为 IntPtr,然后使用 Marshal.PtrToStructure 方法将每个数组元素转换为 Rect 结构体。 本文介绍了如何在 C# 中访问 C++ 动态分配的数组指针,包括 C++ 函数的声明、P/...