c#优雅高效的读取字节数组——不安全代码(1)

这篇具有很好参考价值的文章主要介绍了c#优雅高效的读取字节数组——不安全代码(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在开发上位机的经历中,会有很多需要和下位机交互通信的场景,大多数都会定义一个和硬件的通信协议,最终在上位机代码中的形式其实就是符合通信协议的字节数组。

目录
  • 场景
  • 如何解析字节数组到类或结构体中
    • 建立与通信协议一致的结构体
    • 使用不安全代码将字节数组映射到结构体中
  • 代码解释
    • StructLayout
    • fixed

场景

在控制一些车辆进行货物搬运的业务场景下,我们需要即时的获取小车的状态数据,并且做出解析,最后进行业务处理。不管与下位机是如何通信的,最终都会读取到一个字节数组在内存中。
以TCP通讯为例子,一般会在通讯协议的报文头中定义报文的长度,从而解决一些通讯问题,如粘包等,最后读取到正文部分。

如何解析字节数组到类或结构体中

建立与通信协议一致的结构体

比如通讯协议的正文格式定义如下:

id motor_steps speed
1字节 2字节 1字节
  1. id 小车编号
  2. motor_steps 小车行走累计马达步数
  3. speed 小车当前速度

在代码中建立对应的结构体

[StructLayout(LayoutKind.Explicit)]
        public struct VehicleStatus
        {
            [FieldOffset(0)] public byte id;
            [FieldOffset(1)] public ushort motor_steps;
            [FieldOffset(3)] public byte speed;
        }
使用不安全代码将字节数组映射到结构体中
byte[] metaData = new byte[4] { 10, 88, 89, 5 }; //模拟一段报文
            unsafe
            {
                fixed (byte* metaPointer = metaData)
                {
                    VehicleStatus* status = (VehicleStatus*)metaPointer;

                    Console.WriteLine($"小车编号:{status->id}");
                    Console.WriteLine($"小车速度:{status->speed}");
                    Console.WriteLine($"小车马达步数:{status->motor_steps}");
                }
            }

代码解释

StructLayout

表示某个类或者结构体里的成员的排列方式,这里我们使用LayoutKind.Explicit精确模式,该模式必须配合FieldOffset属性一起制定字段的物理内存排列位置。

fixed

用来钉住可移动变量,确保GC在执行期间对不会重新定位或释放包含对象实例,如果位置变了或者被释放了,谁还管你的非托管的指针对象呢?这边字节数组肯定是一个可移动变量了。

参考文档:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/unsafe-code#fixed-and-moveable-variables文章来源地址https://www.toymoban.com/news/detail-457488.html

到了这里,关于c#优雅高效的读取字节数组——不安全代码(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 1.Unity中c#代码学习(读取物体名称+位置+移动)

    Ctrl + K + C 批量注释 Ctrl + K + U 批量取消注释 Debug.Log(\\\"**\\\");输出“**”中内容 GameObject obj = this.gameObject; this表示当前指代的物品 GameObject表示游戏中物体 Debug.Log(\\\"** 物体名字:\\\" + this.gameObject.name); this.gameObject.name直接调用类名 string name = obj.name; string 是c#中的字符串类型 Debug.Log(\\\"**

    2023年04月11日
    浏览(46)
  • 代码优雅升级,提升开发效率:挖掘Spring AOP配置的学习宝藏!

    1.1.1 语法格式 首先我们先要明确两个概念: 切入点:要进行增强的方法 切入点表达式:要进行增强的方法的描述方式 对于切入点的描述,我们其实是有两中方式的,先来看下前面的例子 描述方式一:执行com.test.dao包下的BookDao接口中的无参数update方法 描述方式二:执行com.test

    2024年02月04日
    浏览(38)
  • 从零开发基于ASM字节码的Java代码混淆插件XHood

    因在公司负责基础框架的开发设计,所以针对框架源代码的保护工作比较重视,之前也加入了一系列保护措施 例如自定义classloader加密保护,授权license保护等,但都是防君子不防小人,安全等级还比较低 经过调研各类加密混淆措施后,决定自研混淆插件,自主可控,能够贴

    2024年02月06日
    浏览(32)
  • 码出高效:Java开发手册笔记(线程安全)

        并发与并行的目标都是尽可能快地执行完所有任务。以医生坐诊为例,某个科室有两个专家同时出诊,这就是两个并行任务,其中一个医生,时而问诊,时而查看化验单,然后继续问诊,突然又中断去处理病人的咨询,这就是并发。在并发环境下,由于程序的封闭性全

    2024年02月08日
    浏览(38)
  • 【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)

    觉得有帮助请点赞关注收藏~~~ 数组时有序的元素序列,存在有限个相同的变量的集合叫做数组名,组成数组二点各个变量称为数组的分量,又称为数组的元素,有时也称为下标变量,用于区分数组的各个元素的数组编号称为下标。 初始化数组 datatype [] arrayname datetype指定存储

    2024年02月04日
    浏览(38)
  • 发那科机器人二次开发 C#读取和写入数据,可以获取点位信息

    发那科机器人二次开发 C#读取和写入数据,可以获取点位信息。 非常适合进行二次开发及制作MES系统。 标题:发那科机器人二次开发中C#读取和写入数据的应用与实践 摘要:本文主要介绍了如何在发那科机器人二次开发中利用C#编程实现数据的读取和写入功能,并探讨了这一

    2024年04月23日
    浏览(49)
  • 【C#进阶】C# 不安全代码

    序号 系列文章 20 【C#进阶】C# 泛型 21 【C#进阶】C# 匿名方法 22 【C#进阶】C# 多线程 📔 大家好啊,我是哈桑c,本文为大家介绍 C# 中的非托管代码。 不安全代码 又称非托管代码,在 C# 中不安全的代码可以使用指针、分配和释放内存块,以及使用函数指针调用方法。注意不安

    2024年02月01日
    浏览(27)
  • FastAPI完全指南:实现高效、安全的Web开发

    在快速发展的互联网时代,高效的Web开发变得尤为重要。Python作为一门广受欢迎的编程语言,其众多Web框架中,FastAPI凭借其出色的性能和易用性,成为了一个炙手可热的选择。FastAPI是一个用于构建API的现代、高性能的Web框架,它基于Python 3.6+的类型提示,提供了快速、直观且

    2024年02月03日
    浏览(41)
  • 低代码应用开发 高效构建业务系统

    低代码是传统软件开发逐步优化和演变的产物,并非全新革命。传统的开发方法过于昂贵和僵化,无法为企业提供所需的高效和敏捷的开发流程,且交付周期长定制能力弱,难以应对不断变化的市场和客户期望,为提高软件开发效率,对代码进行模块化组装的低代码产品进入

    2024年02月12日
    浏览(43)
  • 优雅而高效的JavaScript——模板字面量

    🤨博主:小猫娃来啦 🤨文章核心: 优雅而高效的JavaScript——模板字面量 模板字面量的定义 模板字面量是一种更强大、更灵活的字符串表示方式,使用反引号()包裹。与传统的字符串表示方式相比,模板字量允许在字符串中插入变量、表达式和原始字符串,并且支持多行

    2024年02月07日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包