前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >反射 与 特性 与动态数据解析 针对与Byte类型

反射 与 特性 与动态数据解析 针对与Byte类型

作者头像
Shunnet
发布于 2022-05-31 02:29:54
发布于 2022-05-31 02:29:54
36000
代码可运行
举报
运行总次数:0
代码可运行

下面是工作记录,用于与硬件对接,都是16进制数据处理

[类与数据] [数据与类] 的来回转换

要与添加有特性的类结合使用

可支持多字节与单字节解析 

这属于工作记录,不懂可以联系我哦

【特性定义】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /// <summary>
    /// 记录截取位
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property)]
    public class TruncateLocationAttribute : Attribute
    {
        /// <summary>
        /// 记录截取位 
        /// </summary>
        /// <param name="StartLocation">开始位</param>
        /// <param name="StopLocation">结束位</param>
        public TruncateLocationAttribute(int StartLocation, int StopLocation)
        {
            this.StartLocation = StartLocation;
            this.StopLocation = StopLocation;
        }
        /// <summary>
        /// 开始位
        /// </summary>
        public int StartLocation { get; private set; }
        /// <summary>
        /// 结束位
        /// </summary>
        public int StopLocation { get; private set; }
        public TruncateLocationAttribute(int Location)
        {
            this.Location = Location;
        }
        /// <summary>
        /// 位
        /// </summary>
        public int Location { get; private set; }
    }

【类定义】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        /// <summary>
        /// 设备数据结构体
        /// </summary>
        public class DevDataStructuralBody
        {
            /// <summary>
            /// 存储状态(0~3) 
            /// </summary>
            [TruncateLocation(0, 3)]
            public byte[] saveState { get; set; }
            /// <summary>
            /// 本机IP地址(4~7)
            /// </summary>
            [TruncateLocation(4, 7)]
            public byte[] IP_addr { get; set; }
            /// <summary>
            /// 设备类型(8)
            /// </summary>
            [TruncateLocation(8)]
            public byte TYPE { get; set; }
            /// <summary>
            /// CAN波特率(9)
            /// </summary>
            [TruncateLocation(9)]
            public byte CANBaud { get; set; }
           
            /// <summary>
            /// 通过属性名获取属性值
            /// </summary>
            /// <param name="propertyName">属性名称</param>
            /// <returns></returns>
            public object GetValue(string propertyName)
            {
                return this.GetType().GetProperty(propertyName).GetValue(this, null);
            }
        }

【方法】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        /// <summary>
        /// 通过属性名获取特性值
        /// </summary>
        /// <param name="AttributeName">属性名</param>
        /// <returns></returns>
        object GetAttributeValue(string AttributeName)
        {
            var FieldIfno = typeof(DevDataStructuralBody).GetProperty(AttributeName).GetCustomAttribute<TruncateLocationAttribute>();
            if (FieldIfno.Location != 0)
            {
                return FieldIfno.Location.ToString();
            }
            else
            {
                return new Tuple<int, int>(FieldIfno.StartLocation, FieldIfno.StopLocation);
            }
        }

        /// <summary>
        ///  获取类中的字段
        /// </summary>
        /// <returns>所有字段名称</returns>
        List<string> GetFields<T>(T t)
        {
            List<string> ListStr = new List<string>();
            foreach (var item in t.GetType().GetProperties())
            {
                ListStr.Add(item.Name.ToString());
            }
            return ListStr;
        }



         /// <summary>
        /// 为指定对象分配参数
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="dic">字段/值</param>
        /// <returns></returns>
        public static T Assign<T>(Dictionary<string, object> dic) where T : new()
        {
            Type myType = typeof(T);
            T entity = new T();
            var fields = myType.GetProperties();
            object val;
            object obj;
            foreach (var field in fields)
            {
                if (!dic.Keys.Contains(field.Name))
                    continue;
                val = dic[field.Name.ToString()];
                obj = Convert.ChangeType(val, field.PropertyType);
                field.SetValue(entity, obj, null);
            }
            return entity;
        }


        /// <summary>
        /// 数据转结构体
        /// </summary>
        /// <param name="DeleteHead"></param>
        /// <returns></returns>
        Dictionary<string, object> DataTurnStructuralBody(byte[] DeleteHead)
        {
            Dictionary<string, object> DataList = new Dictionary<string, object>();
            List<string> AttributeNames = GetFields<CanComData.DevDataStructuralBody>(new DevDataStructuralBody());
            foreach (var item in AttributeNames)
            {
                var Data = GetAttributeValue(item);
                //只占一个字节
                string One = Data as string;
                if (One != null)
                {
                    DataList.Add(item, DeleteHead[int.Parse(One)]);
                }
                //占多个字节
                Tuple<int, int> Two = Data as Tuple<int, int>;
                if (Two != null)
                {
                    int Num = (Two.Item2 - Two.Item1) + 1;
                    byte[] bytes = new byte[Num];
                    for (int i = 0; i < Num; i++)
                    {
                        bytes[i] = DeleteHead[Two.Item1 + i];
                    }
                    DataList.Add(item, bytes);
                }
            }

            return DataList;
        }







        /// <summary>
        /// 结构体转数据
        /// </summary>
        /// <param name="DeleteHead"></param>
        /// <returns></returns>
        byte[] StructuralBodyTurnData(DevDataStructuralBody Boty)
        {
            byte[] Datas = new byte[100];
            List<string> AttributeNames = GetFields<DevDataStructuralBody>(Boty);
            foreach (var item in AttributeNames)
            {
               var Value= Boty.GetValue(item);
                var Attribute = GetAttributeValue(item);
                //只占一个字节
                string One = Attribute as string;
                if (One != null)
                {
                    Datas[int.Parse(One)] = (byte)Value;
                }
                //占多个字节
                Tuple<int, int> Two = Attribute as Tuple<int, int>;
                if (Two != null)
                {
                    int Num = (Two.Item2 - Two.Item1) + 1;
                    byte[] bytei = (byte[])Value;
                    for (int i = 0; i < Num; i++)
                    {
                        Datas[Two.Item1 + i] = bytei[i];
                    }
                }
            }
            return Datas;
        }

“关注[顺网]微信公众号,了解更多更有趣的实时信息”

本文作者:[博主]大顺

本文链接:https://shunnet.top/Zv6rMn

版权声明:转载注明出处,谢谢

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C#枚举类型的常用操作总结
彭泽0902
2018/01/04
1.5K0
枚举帮助类
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Linq; 5 6 namespace EnumHelper 7 { 8 /// <summary> 9 /// 枚举帮助类 10 /// 1、获取枚举的描述文本 11 /// 2、获取枚举名和描述信息的列表 12 /// </summary> 13
用户6362579
2019/09/29
5720
Enum扩展特性,代替中文属性
把原文中的out参数替换成返回元组,由于项目是vs2015开发,不能用c#7.0特性,否则用7.0中的值元组应该更好一点。性能和显示友好性都会有改进。
用户6362579
2019/09/29
4290
浅析.NET的反射特性
彭泽0902
2018/01/04
6810
.net服务器端发起请求封装
写一个静态类封装类似客户端的请求 public static class HttpHelper { #region Get public static str
用户1055830
2018/05/28
9130
.NET Core MongoDB数据仓储和工作单元模式封装
上一章我们把系统所需要的MongoDB集合设计好了,这一章我们的主要任务是使用.NET Core应用程序连接MongoDB并且封装MongoDB数据仓储和工作单元模式,因为本章内容涵盖的有点多关于仓储和工作单元的使用就放到下一章节中讲解了。仓储模式(Repository )带来的好处是一套代码可以适用于多个类,把常用的CRUD通用方法抽象出来通过接口形式集中管理,从而解除业务逻辑层与数据访问层之间的耦合,使业务逻辑层在存储、访问数据库时无须关心数据的来源及存储方式。工作单元模式(UnitOfWork)它是用来维护一个由已经被业务修改(如增加、删除和更新等)的业务对象组成的列表,跨多个请求的业务,统一管理事务,统一提交从而保障事物一致性的作用。
追逐时光者
2023/04/28
1.4K0
使用贝叶斯做英文拼写检查(c#)
贝叶斯算法可以用来做拼写检查、文本分类、垃圾邮件过滤等工作,前面我们用贝叶斯做了文本分类,这次用它来做拼写检查,参考:How to Write a Spelling Corrector 拼写检查器的原理 给定一个单词, 我们的任务是选择和它最相似的拼写正确的单词.   对应的贝叶斯问题就是, 给定一个词 w, 在所有正确的拼写词中, 我们想要找一个正确的词 c, 使得对于 w 的条件概率最大, 也就是说: argmaxc P(c|w) 按照贝叶斯理论上面的式子等价于: argmaxc P(w|c) P(c)
JadePeng
2018/03/12
1.4K0
使用贝叶斯做英文拼写检查(c#)
代码小目
标签: 代码片段 日常记录 日常记录的代码片段 1.使用Paralle进行并行计算累加求和的不同形式 public static int ParallelSum(IEnumerable<int> values) { object mutex = new object(); int result = 0; Parallel.ForEach( source: values, localInit: () => 0, body: (item
潘成涛
2018/01/18
6900
【权限的思考】(一)使用反射实现动态权限
  每一个业务系统都会根据业务需要配置各种各样的权限,实现方式也是千差万别,各有各的优缺点。今天我们 利用反射来做一个小的权限管理Demo。也可以说是插件化的权限管理,通用的插件化框架是实现一个接口或者协定, 我们的做法是先展示指定的数据,再去动态的加载需要用到的dll和功能。   大致的思路是这样的,我们从服务或者从数据库里读取哪些dll需要加载,相应的dll下哪些页面可以调用。把这些内容 动态的添加到页面上,当点击页面上的元素时利用反射,匹配目录下的dll和dll内的页面,进行读取,并显示进行交互, 从
lpxxn
2018/01/31
9050
【权限的思考】(一)使用反射实现动态权限
在服务端发起一个Post请求
1.http://www.tuling123.com/openapi/api?key=9d2ff29d44b54e55acadbf5643569584&info=? 上面这个请求在服务端发起 /
用户1055830
2018/03/28
7560
在服务端发起一个Post请求
【愚公系列】2023年02月 WMS智能仓储系统-015.基础设置(商品管理、供应商信息、仓库设置)
文章目录 前言 一、基础设置 1.商品管理 1.1 页面代码 1.2 接口代码 2.供应商信息 2.1 页面代码 2.2 接口代码 3.仓库设置 3.1 页面代码 3.2 接口代码 ---- 前言 基础设置主要分为以下几个模块: 首页 公司信息 角色设置 菜单设置 用户管理 商品类别设置 商品管理 供应商信息 仓库设置 货主信息 运费设置 客户信息 对于商品就要说下SPU和 SKU SPU:SPU(Standard Product Unit):标准化产品单元。是商品信息聚合的最小单位,是一组可复
愚公搬代码
2023/03/16
1.2K0
【愚公系列】2023年02月 WMS智能仓储系统-015.基础设置(商品管理、供应商信息、仓库设置)
ASP.NET MVC5+EF6+EasyUI 后台管理系统(19)-权限管理系统-用户登录
我们之前做了验证码,登录界面,却没有登录实际的代码,我们这次先把用户登录先完成了,要不权限是讲不下去了 把我们之前的表更新到EF中去 登录在Account控制器,所以我们要添加Account的Mode
用户1149182
2018/01/16
2.7K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(19)-权限管理系统-用户登录
C#注册表情缘
记得当时刚接触C#的时候,喜欢编写各种小软件,而注册表系列和网络系列被当时的我认为大牛的必备技能。直到我研究注册表前一天我都感觉他是那么的高深。 今天正好有空,于是就研究了下注册表系列的操作,也随手封装了一个注册表帮助类。简单记一下,当饭后娱乐 完整Demo研究:https://github.com/dunitian/LoTCodeBase/tree/master/NetCode/0.知识拓展/02.注册表系 这个是一些常用的方法和属性(不全,只是列出了比较常用的一些)【OpenSubKey(string
逸鹏
2018/04/10
1.2K0
C#注册表情缘
.net core 从(本地)服务器获取APK文件并解析APK信息
注:此段代码解析APK时,若APK包含中文会极其的卡顿,建议上传前先用Npinyin重命名再次上传,至于原因已提交GitHub,暂未得到回复,所以先自己重命名再上传吧
GoodTime
2023/10/31
4980
教你写个简单的 Redis Client 框架 - .NET Core
最近叶老板写了个 FreeRedis,刚好前段时间在学习 Redis,于是跟风试试也写一个简单的 RedisClient。目前 FreeRedis 处于初级阶段,需要更多人的参与、测试,有兴趣大家一起参与贡献:
痴者工良
2021/04/26
1.3K0
PropertyGrid中的枚举显示为中文
本文转载:http://www.cnblogs.com/yank/archive/2011/09/17/2179598.html
跟着阿笨一起玩NET
2018/09/18
1.2K0
PropertyGrid中的枚举显示为中文
U3D观察者模式,实现1对多
发出消息时,1.根据GameObject是否存在,删除对应消息表中。 2。先保存一遍要处理的消息,因为有些委托是创建对象,如果对象初始化执行
立羽
2023/08/24
1890
C# Redis的五大数据结构相关操作及应用场景
下面额代码类均是通过 ServiceStack.Redis 来对Redis进行各种操作
明志德道
2023/10/21
6920
C#   Redis的五大数据结构相关操作及应用场景
RTSP协议视频智能分析/内容识别平台EasyNVR安防视频云服务关于POST接口C#调用的例子介绍说明
TSINGSEE青犀视频云边端架构视频智能分析平台EasyNVR、EasyCVR等具备视频流拉取、转码、分发的功能,并且我们提供丰富的API接口进行二次开发。
EasyNVR
2020/12/08
6790
C#反射与特性(九):全网最全-解析反射
C# 中的访问修饰符:public、private、protected、internal、protected internal。
痴者工良
2021/04/26
2.1K0
推荐阅读
相关推荐
C#枚举类型的常用操作总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验