Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
代码小目
标签: 代码片段 日常记录 日常记录的代码片段 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
6910
U3D观察者模式,实现1对多
发出消息时,1.根据GameObject是否存在,删除对应消息表中。 2。先保存一遍要处理的消息,因为有些委托是创建对象,如果对象初始化执行
立羽
2023/08/24
1890
C#反射与特性(九):全网最全-解析反射
C# 中的访问修饰符:public、private、protected、internal、protected internal。
痴者工良
2021/04/26
2.1K0
C#枚举类型的常用操作总结
彭泽0902
2018/01/04
1.5K0
Enum扩展特性,代替中文属性
把原文中的out参数替换成返回元组,由于项目是vs2015开发,不能用c#7.0特性,否则用7.0中的值元组应该更好一点。性能和显示友好性都会有改进。
用户6362579
2019/09/29
4290
浅谈 C# 13 中的 params 集合
在 C# 13 中,params 的改进使其从可变数量的数组参数升级为可变数量的集合类型参数。这一改进通过支持高性能集合类型(如Span<T>,ReadOnlySpan<T>)和简化调用语法,显著提升了代码的灵活性和效率。
追逐时光者
2025/03/20
600
浅谈 C# 13 中的 params 集合
.NET Core MongoDB数据仓储和工作单元模式封装
上一章我们把系统所需要的MongoDB集合设计好了,这一章我们的主要任务是使用.NET Core应用程序连接MongoDB并且封装MongoDB数据仓储和工作单元模式,因为本章内容涵盖的有点多关于仓储和工作单元的使用就放到下一章节中讲解了。仓储模式(Repository )带来的好处是一套代码可以适用于多个类,把常用的CRUD通用方法抽象出来通过接口形式集中管理,从而解除业务逻辑层与数据访问层之间的耦合,使业务逻辑层在存储、访问数据库时无须关心数据的来源及存储方式。工作单元模式(UnitOfWork)它是用来维护一个由已经被业务修改(如增加、删除和更新等)的业务对象组成的列表,跨多个请求的业务,统一管理事务,统一提交从而保障事物一致性的作用。
追逐时光者
2023/04/28
1.5K0
(十三)c#Winform自定义控件-导航菜单
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/11
4.7K0
(十三)c#Winform自定义控件-导航菜单
教你写个简单的 Redis Client 框架 - .NET Core
最近叶老板写了个 FreeRedis,刚好前段时间在学习 Redis,于是跟风试试也写一个简单的 RedisClient。目前 FreeRedis 处于初级阶段,需要更多人的参与、测试,有兴趣大家一起参与贡献:
痴者工良
2021/04/26
1.3K0
枚举帮助类
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
5740
T4模板生成代码。 数据实体层与数据仓储层。备注
文件下载连接 http://download.csdn.net/download/drawdream/9916255
蓝夏
2022/05/10
6550
.net服务器端发起请求封装
写一个静态类封装类似客户端的请求 public static class HttpHelper { #region Get public static str
用户1055830
2018/05/28
9150
浅析.NET的反射特性
彭泽0902
2018/01/04
6830
内存缓存MemoryCache
内存缓存MemoryCache实现了ICache接口,Redis同样实现了ICache接口,两者在缓存操作上达到了高度抽象统一。应用设计时一律使用ICache接口,开发环境装配为MemoryCache,生产环境根据分布式需要可以装配为Redis。如果应用系统没有分布式需求,继续使用MemoryCache更好。
JusterZhu
2022/12/07
8410
内存缓存MemoryCache
【权限的思考】(一)使用反射实现动态权限
  每一个业务系统都会根据业务需要配置各种各样的权限,实现方式也是千差万别,各有各的优缺点。今天我们 利用反射来做一个小的权限管理Demo。也可以说是插件化的权限管理,通用的插件化框架是实现一个接口或者协定, 我们的做法是先展示指定的数据,再去动态的加载需要用到的dll和功能。   大致的思路是这样的,我们从服务或者从数据库里读取哪些dll需要加载,相应的dll下哪些页面可以调用。把这些内容 动态的添加到页面上,当点击页面上的元素时利用反射,匹配目录下的dll和dll内的页面,进行读取,并显示进行交互, 从
lpxxn
2018/01/31
9060
【权限的思考】(一)使用反射实现动态权限
C#开源实用的工具类库,集成超过1000多种扩展方法
今天大姚给大家分享一个C#开源(MIT License)、免费、实用且强大的工具类库,集成超过1000多种扩展方法增强 .NET Framework 和 .NET Core的使用效率:Z.ExtensionMethods。
追逐时光者
2024/06/05
2420
C#开源实用的工具类库,集成超过1000多种扩展方法
C# Redis的五大数据结构相关操作及应用场景
下面额代码类均是通过 ServiceStack.Redis 来对Redis进行各种操作
明志德道
2023/10/21
6930
C#   Redis的五大数据结构相关操作及应用场景
WF追忆
  前一阵子学习了一下工作流,现在写个总结记录一下这个过程。要弄工作流,首先就要有个界面来画图,做web的,没办法,只能选择javascript和silverlight,找来找去,最后用了Shareidea的和Workflow11的界面,在此对他们表示感谢,界面是在Shareidea上面进行的修改,把Workflow11的很多东西也揉进来了,最后合成的一个杂交体。但是最后因为要玩hadoop,要清理磁盘空间,把工程给误删了,直到现在才发现。。我3个月的业余时间完成的代码全部被干掉了,已经无法挽回了,只能做一
岑玉海
2018/03/01
1.1K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(81)-数据筛选(万能查询)
前言 听标题的名字似乎是一个非常牛X复杂的功能,但是实际上它确实是非常复杂的,我们本节将演示如何实现对数据,进行组合查询(数据筛选) 我们都知道Excel中是如何筛选数据的.就像下面一样 他是一
用户1149182
2018/01/12
2.6K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(81)-数据筛选(万能查询)
【愚公系列】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.基础设置(商品管理、供应商信息、仓库设置)
相关推荐
代码小目
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验