在C#进行UDP或者TCP/IP通信时,经常要用到byte数组来传递信息。一开始,我是使用BitConverter和Encoding来进行转换。后来经过大神指导,其实一切不必那么麻烦。只需将要发送的信息封装成结构体,使用C#自带的一个转换类便可轻松搞定。

首先建立一个结构体

//必须引用的库
using System.Runtime.InteropServices;namespace Test
{[StructLayoutAttribute(LayoutKind.Sequential, CharSet=CharSet.Ansi,Pack=1)]struct SensorHeadInfo{public uint cmdId;[MarshalAs(UnmanagedType.ByValArray,SizeConst=5)]public byte[] time_t;public ushort msgLength;public byte errorFlag;public byte moduleId;}
}

其次建立转换类

using System;
using System.Runtime.InteropServices;namespace Test
{class MessageSwitch{/// <summary>/// 将结构体转换为byte数组/// </summary>/// <typeparam name="T"> 泛型T</typeparam>/// <param name="structObj">结构体对象</param>/// <returns></returns>public static byte[] StructToBytes<T>(T structObj) where T : struct{// 获取结构体对象的字节数int size = Marshal.SizeOf(structObj);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);return bytes;}public static T BytesToStruct<T>(byte[] bytes) where T:struct{T obj = new T();int size = Marshal.SizeOf(obj);// 如果结构体对象的字节数大于所给byte数组的长度,则返回空if (size > bytes.Length){return (default(T));}IntPtr structPtr = Marshal.AllocHGlobal(size);Marshal.Copy(bytes, 0, structPtr, size);object tempObj = Marshal.PtrToStructure(structPtr, obj.GetType());Marshal.FreeHGlobal(structPtr);return (T)tempObj; }}
}

使用方法如下

 public static byte[] getSensorHeaserInfo(){Random random = new Random(DateTime.Now.Millisecond + DateTime.Now.Second);SensorHeadInfo headerInfo = new SensorHeadInfo();int index = random.Next(0, moduleTypeVal.Count);headerInfo.cmdId = 12;headerInfo.time_t = new byte[5];headerInfo.moduleId = 13;// get message lengthheaderInfo.msgLength = (ushort)13;// create message bytes arraybyte[] res = new byte[13];
 <span style="white-space:pre"> </span>    MessageSwitch.StructToBytes<SensorHeadInfo>(headerInfo).CopyTo(res, 0);return res;}

至于字节数转换结构体则如下

byte[] msg = m_listenUdp.Receive(ref remoteEndPoint);
SensorHeadInfo headerInfo = MessageSwitch.BytesToStruct<SensorHeadInfo>(msg);

接收到消息后直接转换

C#通信,结构体和byte数组互转相关推荐

  1. c++与C# winform的消息通讯--(结构体与byte数组的使用)

    转载:http://www.cnblogs.com/lizhaoduo/p/3870809.html 近期正在做一个蓝牙驱动的使用程序,其中有一块从c++发送数据到C#的部分,网上查了很多资料,大多都 ...

  2. C#结构体和字节数组的转换

    在写C#TCP通信程序时,发送数据时,只能发送byte数组,处理起来比较麻烦不说,如果是和VC6.0等写的程序通信的话,很多的都是传送结构体,在VC6.0中可以很方便的把一个char[]数组转换为一个 ...

  3. C# 结构体转字节数组

    (1)定义结构体 public struct Data1     {         [MarshalAs(UnmanagedType.ByValArray)]         public char ...

  4. go语言json字符串解析为结构体数组,结构体指针的数组

    废话不多说直接上效果图 完整代码如下 package main import ("encoding/json""fmt" ) // 结构体定义 type rob ...

  5. 安防监控之软硬件环境分析和通信结构体定义

    文章目录 声明 软硬件环境分析 FS4412 资源描述 ZigBee 开发套件简介 通信结构体定义 zigbee 模块对象信息参数结构体 A9模块对象信息参数结构体 环境参数对象结构体参数 所有监控区 ...

  6. C#:钩子、委托、匿名、事件、结构体转字节数组、多线程操纵控件、UDP

    事件 C#事件分为几个步骤: 定义事件 定义处理函数 为事件添加处理函数 激活事件 事件被激活后自动调用处理函数. public event messagehandleer shenzhijiangl ...

  7. matlab单元数组与结构体的区别,MATLAB中的结构体和单元数组

    MATLAB中的结构体和单元数组 一.结构: x.real=10 x.imag=5 增加字段 x.scale=1 使用struct函数 s=struct('field1',values1,'field ...

  8. 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明...

    [VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及 ...

  9. Golang之空结构体和零长数组的实践

    空结构体和零长数组(两个复合类型)都仅仅是一个占位符,不占用空间,这里编译器进行了优化,如果结构体或数组的unsafe.sizeof=0则直接返回zerobase. // 必须用key来初始化结构体 ...

最新文章

  1. 反射式红外光电检测管 : ITR9909
  2. java socket nio 阻塞_Java NIO实现非阻塞式socket通信
  3. SpringBoot内置Tomcat支持多大并发量和连接数
  4. Counting Bits(Difficulty: Medium)
  5. 168输出为861java_AcWing 861. 二分图的最大匹配-java-关键处注释
  6. 萌新学python(输入与输出)
  7. IIS 7.5 下PHP(FastCGI模式)配置手记
  8. mysql练习_MySQL基础知识—习题练习
  9. 使用Python的basemap模块绘制地图的局部放大图(主图及放大的子图)
  10. steamcom启动服务:443端口被占用,请关闭占用该端口的进程后再点击启动服务!
  11. wps页眉显示一级标题_wps页眉(WPS页眉设置为章节标题)
  12. nodejs进程守护神forever
  13. 大数据创造智慧城市的未来之光!
  14. 人体下肢表面肌电,足底压力和关节角度分析
  15. android 充话费接口,调用手机话费充值API的SDK编写思路
  16. 理解Intel cpufreq intel_pstate driver的工作模式
  17. 线性时不变因果系统的判断方法
  18. MindManager2020永久激活版如何绘制思维导图
  19. 速腾聚创完成新一轮融资:华兴新经济基金领投 筹备上市
  20. 10大主流压力测试工具推荐

热门文章

  1. 对立统一(哲学与分析学)
  2. java前后端分离框架,SpringCloud开发微服务平台
  3. 苹果ios APP怎么打包?
  4. 汽车行业:充分借力数据价值,推动数字化营销链路闭环
  5. 【收集】巴厘岛自助游攻略
  6. PICASSO,一个高效的搜推广稀疏训练解决方案
  7. ThinkPad E420升级改造过程
  8. SuperMap iClient3D for WebGL教程-管线流动特效
  9. C#语言实例源码系列-实现加密exe文件
  10. 开山斧0.3.8(跨平台版本)《源码已开放》