当前位置:首页 > 技术分析 > 正文内容

CRC-16-modbus循环校验方法

ruisui883个月前 (03-26)技术分析44

该方法未修改前来自AI问答,可是结果是小端序列,ModbusRtu协议是大端序列,因为在输出处我修改成了大端序列输出,再强调一下,西门子PLC中的存储方式也是大端序列,即高字节在前,低字节在后,按照人们熟知的方式存储数据。

以下是一个用于 Modbus 中 CRC-16 循环校验的方法,包含校验验证功能,输出结果为字节数组形式:

代码块:

 public static class Crc16Helper
 {
     private const ushort polynomial = 0xA001;
     private static ushort[] crcTable = new ushort[256];

     private void Crc16Helper()
     {
         for (int i = 0; i < 256; i++)
         {
             ushort crc = (ushort)i;
             for (int j = 0; j < 8 j if crc 1='= 1)' crc='(ushort)((crc'>> 1) ^ polynomial);
                 }
                 else
                 {
                     crc >>= 1;
                 }
             }
             crcTable[i] = crc;
         }
     }

     public static byte[] CalculateCrc(byte[] data)  //CRC-16计算方法
     {
         ushort crc = 0xFFFF;
         foreach (byte b in data)
         {
             crc = (ushort)((crc >> 8) ^ crcTable[(crc ^ b) & 0xFF]);
         }
        Byte[] result= new byte[] { (byte)(crc >> 8), (byte)crc };
         // 将CRC转换为大端序
         if (BitConverter.IsLittleEndian)
         {
         Array.Reverse(result); // 转换为大端序
         }
          return result;
     }

     public static bool VerifyCrc(byte[] data, byte[] receivedCrc)//验证校验结果是否正确
     {
         byte[] calculatedCrc = CalculateCrc(data);
         return calculatedCrc[0] == receivedCrc[0] && calculatedCrc[1] == receivedCrc[1];
     }
}

测试代码块:

static void Main()
{
    byte[] data = { 0x01, 0x03, 0x00, 0x00, 0x00, 0x02 };

    // 计算CRC并输出为byte数组
    byte[] crcBytes = Crc16Helper.CalculateCrc(data);
    Console.WriteLine($"CRC: {crcBytes[0]},{crcBytes[1]}");

    // 校验CRC
    bool isValid = Crc16Helper.VerifyCrc(data, crcBytes);
    Console.WriteLine($"CRC校验结果: {isValid}");
}

输出结果是:

CRC: 196,11

CRC校验结果: True

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3047.html

标签: java crc校验
分享给朋友:

“CRC-16-modbus循环校验方法” 的相关文章

内存问题探微

这篇文章是我在公司 TechDay 上分享的内容的文字实录版,本来不想写这么一篇冗长的文章,因为有不少的同学问是否能写一篇相关的文字版,本来没有的也就有了。说起来这是我第二次在 TechDay 上做的分享,四年前第一届 TechDay 不知天高地厚,上去讲了一个《MySQL 最佳实践》,现在想起来那...

我的VIM配置

写一篇关于VIM配置的文章,记录下自己的VIM配置,力求简洁实用。VIM的配置保存在文件~/.vimrc中(Windows下是C:\Users\yourname \_vimrc)。VIM除了自身可配置项外,还可插件扩展。VIM的插件一般用vundle或vim-plug来管理,但我力求简单,不打算装太...

K8S NFS 共享存储

NFS 共享存储前面我们学习了 hostPath 与 Local PV 两种本地存储方式,但是平时我们的应用更多的是无状态服务,可能会同时发布在不同的节点上,这个时候本地存储就不适用了,往往就需要使用到共享存储了,比如最简单常用的网络共享存储 NFS,本节课我们就来介绍下如何在 Kubernetes...

从 Vue2.0 到 React17——React 开发入门

作者:佚名来源:前端大全前言找工作时发现有一些公司是以React作为技术栈的,而且薪资待遇都不错,为了增加生存的筹码,所以还是得去学一下React,增加一项求生技能。因为我用Vue2.0开发项目已经四年了,故用Vue2.0开发项目的思路来学习React。前端项目是由一个个页面组成的,对于Vue来说,...

Vue真是太好了 壹万多字的Vue知识点 超详细!

1??、Vue和其他两大框架的区别Angular 学习成本太高React 代码可读性差Vue 学习成本较低 很容易上手VUE官方: https://cn.vuejs.org/v2/guide/comparison.html?2??、Vue是什么Vue是一套用于构建用户界面的渐进式框架 "前端...

Vue实战篇|使用路由管理用户权限(动态路由)

权限控制是后台管理系统比较常见的需求,如果我们需要对某些页面的添加权限控制的话,那我们可以在路由管理中的权限做一些校验,没有通过权限校验的给出相应的提示或者直接跳转到报错页面。跟着我一起来学vue实战篇路由管理权限吧!权限校验函数getCurrentAuthority()函数用于获取当前用户权限,一...