百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

给大家分享一个我经常使用的类「含源码」

bigegpt 2024-09-08 11:25 8 浏览

前言

今天跟大家分享一个我自己封装,而且经常使用的类,话不多说,直接看源码。

源码

    /// <summary>
    /// 字节集合类
    /// </summary>
    public class ByteArray
    {
        /// <summary>
        /// 初始化一个List集合对象
        /// </summary>
        private List<byte> list = new List<byte>();

        /// <summary>
        /// 通过索引获取值
        /// </summary>
        /// <param name="index">索引</param>
        /// <returns>返回字节</returns>
        public byte this[int index]
        {
            get => list[index];
            set => list[index] = value;
        }

        /// <summary>
        /// 返回长度
        /// </summary>
        public int Length => list.Count;


        /// <summary>
        /// 通过属性返回字节数组
        /// </summary>
        public byte[] array
        {
            get { return list.ToArray(); }
        }

        /// <summary>
        /// 清空字节数组
        /// </summary>
        public void Clear()
        {
            list.Clear();
        }

        /// <summary>
        /// 添加一个字节
        /// </summary>
        /// <param name="item">字节</param>
        public void Add(byte item)
        {
            list.Add(item);
        }

        /// <summary>
        /// 添加一个字节数组
        /// </summary>
        /// <param name="items">字节数组</param>
        public void Add(byte[] items)
        {
            list.AddRange(items);
        }

        /// <summary>
        /// 添加二个字节
        /// </summary>
        /// <param name="item">字节</param>
        public void Add(byte item1, byte item2)
        {
            Add(new byte[] { item1, item2 });
        }

        /// <summary>
        /// 添加三个字节
        /// </summary>
        /// <param name="item">字节</param>
        public void Add(byte item1, byte item2, byte item3)
        {
            Add(new byte[] { item1, item2, item3 });
        }

        /// <summary>
        /// 添加四个字节
        /// </summary>
        /// <param name="item">字节</param>
        public void Add(byte item1, byte item2, byte item3, byte item4)
        {
            Add(new byte[] { item1, item2, item3, item4 });
        }

        /// <summary>
        /// 添加五个字节
        /// </summary>
        /// <param name="item">字节</param>
        public void Add(byte item1, byte item2, byte item3, byte item4, byte item5)
        {
            Add(new byte[] { item1, item2, item3, item4, item5 });
        }


        /// <summary>
        /// 添加一个ByteArray对象
        /// </summary>
        /// <param name="byteArray">ByteArray对象</param>
        public void Add(ByteArray byteArray)
        {
            list.AddRange(byteArray.array);
        }

        public void Insert(int index, byte item)
        {
            list.Insert(index,item);
        }


        public void Insert(int index, byte[] item)
        {
            for (int i = 0; i < item.Length; i++)
            {
                list.Insert(index + i, item[i]);
            }
        }

        /// <summary>
        /// 添加一个ushort类型数值
        /// </summary>
        /// <param name="value">ushort类型数值</param>
        /// <param name="dataFormat">字节序</param>
        public void Add(ushort value,DataFormat dataFormat)
        {
            byte[] data = BitConverter.GetBytes(value);

            byte[] result = new byte[data.Length];

            switch (dataFormat)
            {
                case DataFormat.ABCD:
                case DataFormat.CDAB:
                    result[0] = data[1];
                    result[1] = data[0];
                    break;
                case DataFormat.BADC:
                case DataFormat.DCBA:
                    result[0] = data[0];
                    result[1] = data[1];
                    break;
                default:
                    break;
            }
            Add(result);
        }

        /// <summary>
        /// 添加一个short类型数值
        /// </summary>
        /// <param name="value">short类型数值</param>
        /// <param name="dataFormat">字节序</param>
        public void Add(short value, DataFormat dataFormat)
        {
            byte[] data = BitConverter.GetBytes(value);

            byte[] result = new byte[data.Length];

            switch (dataFormat)
            {
                case DataFormat.ABCD:
                case DataFormat.CDAB:
                    result[0] = data[1];
                    result[1] = data[0];
                    break;
                case DataFormat.BADC:
                case DataFormat.DCBA:
                    result[0] = data[0];
                    result[1] = data[1];
                    break;
                default:
                    break;
            }
            Add(result);
        }

        /// <summary>
        /// 添加一个ushort类型数值
        /// </summary>
        /// <param name="value">ushort类型数值</param>
        /// <param name="dataFormat">字节序</param>
        public void Insert(int index, ushort value, DataFormat dataFormat)
        {
            byte[] data = BitConverter.GetBytes(value);

            byte[] result = new byte[data.Length];

            switch (dataFormat)
            {
                case DataFormat.ABCD:
                case DataFormat.CDAB:
                    result[0] = data[1];
                    result[1] = data[0];
                    break;
                case DataFormat.BADC:
                case DataFormat.DCBA:
                    result[0] = data[0];
                    result[1] = data[1];
                    break;
                default:
                    break;
            }
            Insert(index, result);
        }

        /// <summary>
        /// 添加一个short类型数值
        /// </summary>
        /// <param name="value">short类型数值</param>
        /// <param name="dataFormat">字节序</param>
        public void Insert(int index, short value, DataFormat dataFormat)
        {
            byte[] data = BitConverter.GetBytes(value);

            byte[] result = new byte[data.Length];

            switch (dataFormat)
            {
                case DataFormat.ABCD:
                case DataFormat.CDAB:
                    result[0] = data[1];
                    result[1] = data[0];
                    break;
                case DataFormat.BADC:
                case DataFormat.DCBA:
                    result[0] = data[0];
                    result[1] = data[1];
                    break;
                default:
                    break;
            }
            Insert(index, result);
        }
    }

分析

这个类其实是对List集合的二次封装,但是会比集合增加了更多的功能,实际使用的时候代码也会比集合要简洁一些。

具体好不好用,用了就知道!

给大家看一个实际应用场景。

        /// <summary>
        /// 根据起始地址及长度,确定读取协议帧
        /// </summary>
        /// <param name="address">起始地址</param>
        /// <param name="length">长度</param>
        /// <returns>协议帧数据</returns>
        public  virtual OperateResult<byte[]> BuildReadMessageFrame(string address, ushort length)
        {
            var result = MelsecHelper.MelsecAddressAnalysis(address, IsFx5U);
            if (!result.IsSuccess) return OperateResult.CreateFailResult<byte[]>(result);

            //创建ByteArray对象
            ByteArray sendCommand = new ByteArray();
            // 副头部
            sendCommand.Add(0x50, 0x00);
            // 网络编号
            sendCommand.Add(NetworkNo);
            // 可编程控制器编号
            sendCommand.Add(0xFF);
            // 请求目标模块I/O编号
            sendCommand.Add(0xFF, 0x03);
            // 请求目标模块站号
            sendCommand.Add(DstModuleNo);
            // 请求数据长度
            sendCommand.Add(0x0C, 0x00);
            // CPU监视定时器
            sendCommand.Add(0x0A, 0x00);
            // 指令
            sendCommand.Add(0x01, 0x04);
            // 子指令
            sendCommand.Add(result.Content1.AreaType, 0x00);
            // 起始软元件
            byte[] startAddress = BitConverter.GetBytes(result.Content2);
            sendCommand.Add(startAddress[0], startAddress[1], startAddress[2]);
            // 软元件代码
            sendCommand.Add(result.Content1.AreaBinaryCode);
            // 软元件点数
            sendCommand.Add((byte)(length % 256), (byte)(length / 256));

            return OperateResult.CreateSuccessResult(sendCommand.array);
        }

我是新阁上位机付老师,用我的专业,成就你的梦想!

相关推荐

恢复软件6款汇总推荐,帮你减轻数据恢复压力!

在当今数字化生活中,数据丢失的风险如影随形。无论是误删文件、硬盘故障,还是遭遇病毒攻击,丢失的数据都可能给我们带来不小的麻烦。此时,一款优秀的数据恢复软件就成为了挽救数据的关键。今天,为大家汇总推荐...

中兴星星一号刷回官方原版recovery的教程

【搞科技教程】中兴星星一号的官方recovery也来说一下了,因为之前给大家分享过了第三方的recovery了,之前给大家分享的第三方recovery也是采用一键刷入的方式,如果细心的朋友会发现,之前...

新玩机工具箱,Uotan柚坛工具箱软件体验

以前的手机系统功能比较单调,各厂商的重视程度不一样,所以喜欢玩机的朋友会解锁手机系统的读写权限,来进行刷机或者ROOT之类的操作,让使用体验更好。随着现在的手机系统越来越保守,以及自身功能的增强,...

三星g906k刷recovery教程_三星g906k中文recovery下载

【搞科技教程】看到有一些机友在找三星g906k的第三方recovery,下面就来说一下详细的recovery的刷入方法了,因为手机只有有了第三方的recovery之后才可以刷第三方的root包和系统包...

中兴星星2号刷recovery教程_星星二号中文recovery下载

【搞科技教程】咱们的中兴星星2手机也就是中兴星星二号手机的第三方recovery已经出来了,并且是中文版的,有了这个recovery之后,咱们的手机就可以轻松的刷第三方的系统包了,如果没有第三方的re...

数据恢复软件有哪些值得推荐?这 6 款亲测好用的工具汇总请收好!

在数字生活中,数据丢失的阴霾常常突如其来。无论是误删工作文档、格式化重要磁盘,还是遭遇系统崩溃,都可能让我们陷入焦虑。关键时刻,一款得力的数据恢复软件便是那根“救命稻草”。今天,为大家精心汇总6...

中兴u956刷入recovery的教程(中兴e5900刷机)

【搞科技教程】这次主要来给大家说说中兴u956手机如何刷入第三方的recovery,因为第三方的recovery工具是咱们刷第三方rom包的基础,可是很我欠却不会刷,所以太这里来给大家整理了一下详细的...

联想A850+刷recovery教程 联想A850+第三方recovery下载

【搞科技教程】联想A850+的第三方recovery出来了,这个第三方的recovery是非常的重要的,比如咱们的手机要刷第三方的系统包的时候,都是需要用到这个第三方的recovery的,在网上也是有...

工具侠重大更新 智能机上刷机一条龙完成

工具侠是针对玩机的机油开发的一款工具,不管是发烧级别的粉丝,还是普通小白用户,都可以在工具侠上找到你喜欢的工具应用。这不,最新的工具侠2.0.16版本,更新了专门为小白准备的刷机助手工具,以及MTK超...

shift+delete删除的文件找回6种硬盘数据恢复工具

硬盘作为电脑的重要存储设备,如同一个巨大的数字仓库,承载着我们日常工作、学习和生活中的各种文件,从珍贵的照片、重要的工作文档到喜爱的视频、音乐等,都依赖硬盘来安全存放。但有时,我们可能会不小心用sh...

使用vscode+Deepseek 实现AI编程 基于Cline和continue

尊敬的诸位!我是一名专注于嵌入式开发的物联网工程师。关注我,持续分享最新物联网与AI资讯和开发实战。期望与您携手探寻物联网与AI的无尽可能。这两天deepseek3.0上线,据说编程能力比肩Cl...

详解如何使用VSCode搭建TypeScript环境(适合小白)

搭建Javascript环境因为TypeScript不能直接在浏览器上运行。它需要编译器来编译并生成JavaScript文件。所以需要首先安装好javascript环境,可以参考文章:https://...

使用VSCode来书写你的Jupyter Notebooks

现在你可以在VScode里面来书写你的notebook了,使用起来十分的方便。下面来给大家演示一下环境的搭建。首先需要安装一个jupyter的包,使用下面的命令安装:pip3install-ih...

使用VSCode模板提高Vue开发效率(vscode开发vue插件)

安装VSCode安装Vetur和VueHelper插件,安装完成后需要重启VScode。在扩展插件搜索框中找到如下Vetur和VueHelper两个插件,注意看图标。添加Vue模板打...

干货!VsCode接入DeepSeek实现AI编程的5种主流插件详解

AI大模型对编程的影响非常之大,可以说首当其冲,Cursor等对话式编程工具渐渐渗透到开发者的工作中,作为AI编程的明星产品,Cursor虽然好用,但是贵啊,所以咱们得找平替,最好免费那种。俗话说,不...