C#使用struct直接转换下位机数据的示例代码
- 作者: 王杉65883988
- 来源: 51数据库
- 2021-07-11
编写上位机与下位机通信的时候,涉及到协议的转换,比较多会使用到二进制。传统的方法,是将数据整体获取到byte数组中,然后逐字节对数据进行解析。这样操作工作量比较大,对于较长数据段更容易计算位置出错。
其实,对于下位机给出通讯的数据结构的情况下,可以直接使用c#的struct将数据直接转换。需要使用到marshal。
数据结构
假定下位机(c语言编写)给到我们的数据结构是这个,传输方式为小端方式
方法1
首先需要定义一个struct:
然后使用以下进行转换
注意这里我使用的方式为layoutkind.sequential,如果直接使用layoutkind.explicit并设置fieldoffset会弹出一个诡异的错误system.typeloadexception:“could not load type 'consoleapp3.dataitem' from assembly 'consoleapp3, version=1.0.0.0, culture=neutral, publickeytoken=null' because it contains an object field at offset 4 that is incorrectly aligned or overlapped by a non-object field.”。
方法2
提示是对齐的错误,这个和编译的时候使用的32bit和64位是相关的,详细数据封送对齐的操作我不就详细说了,贴下代码。
强制指定x64编译没有成功,因为数据对齐后和从下位机上来的数据长度是不符的。
方法3
微软不是很推荐使用layoutkind.explicit,如果非要用并且不想指定平台的话,可以使用指针来操作,当然,这个需要unsafe。
方法4
感觉写起来还是很麻烦,既然用上了unsafe,就干脆直接一点。
这样,获得数组可以直接正常访问,不再需要unsafe了。
总结
数据解析作为上下位机通讯的常用操作,使用struct直接转换数据可以大大简化工作量。建议还是使用layoutkind.sequential来进行封送数据,有关于数据在托管与非托管中的转换,可以详细看看微软有关的内容。
以上代码在.net 5.0下编译通过并能正常执行。
补充
注意上面的前提要求是字节序为小端字节序(一般计算机都是小端字节序),对于大端字节序发送过来的数据,需要进行字节序转换。我找到一处写的很好:
参考资料
到此这篇关于c#使用struct直接转换下位机数据的文章就介绍到这了,更多相关c#下位机数据内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
- C#通过fleck实现wss协议的WebSocket多人Web实时聊天(附源码)
- 团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
- 使用 MSBuild.exe 在发布模式下构建 C# 解决方案
- 当我发布 Web 应用程序时,AfterPublish 脚本不运行
- 构建时 T4 转换的产品仅在下一个构建中使用
- ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
- 新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
- 如何将条件编译符号(DefineConstants)传递给 msbuild
- MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
- NuGet 包还原找不到包,没有源
