编程示例: 计算CRC校验码

news2024/11/27 2:17:03

编程示例: 计算CRC校验码

循环冗余检查(CRC)是一种数据传输检错功能,对数据进行
多项式计算,并将得到的结果附在帧的后面,接收设备也执行
类似的算法,进而可以保证在软件层次上数据传输的正确性和
完整性。

CRC-16校验码的应用
根据Modbus协议,常规485通讯的信息发送形式如下:

地址 功能码 数据信息 校验码
1byte 1byte N byte 2byte
其中2 Byte的校验码一般就是采用CRC16。

CRC的算法种类
CRC-16 ,CRC-32等它们使用不同的生成多项式
CRC-16 MODBUS 使用的多项式是x^16+x^15+x^2+1
写成十六进制是0x8005 ,它的反向的序的值是0xa001。

生成CRC有两个算法,一个是直接计算,另一个是查表法。

javascript语言的实现的代码如下:

<html>
<title>计算CRC校验码</title>
<body>
<p>输入十六进制序列:例如 0x01,0x03,0x00,0x00,0x00,0x02</p>
<textarea id='txt2' rows="3" cols="130"></textarea>
<p>校验码:</p><textarea id='result' rows="3" cols="130"></textarea>
<button id="button" οnclick="make_crc()">生成CRC校验码</button>
<script>
 
 var aucCRCHi=[

       0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

       0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

       0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

       0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

       0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

       0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

       0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

       0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

       0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

       0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

       0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

       0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

       0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

       0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

       0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

       0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

       0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

       0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

       0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

       0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

       0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

       0x00, 0xC1, 0x81, 0x40

];

var aucCRCLo=[

       0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7,

       0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E,

       0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9,

       0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,

       0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

       0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,

       0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D,

       0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38,

       0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF,

       0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,

       0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1,

       0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,

       0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB,

       0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,

       0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,

       0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,

       0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97,

       0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,

       0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89,

       0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,

       0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,

       0x41, 0x81, 0x80, 0x40
];
/*查表法计算 CRC16 (Modbus)*/
function GetQuickCRC16( pBuffer, Length) 
{
       var CRCHi = 0xFF;
       var CRCLo = 0xFF;
       var iIndex = 0;

       for (var i = 0; i < Length; i++)
       {
              iIndex = CRCHi ^ pBuffer[i];
              CRCHi = CRCLo ^ aucCRCHi[iIndex];
              CRCLo = aucCRCLo[iIndex];
       }
       return ( CRCHi << 8 | CRCLo);// CRC校验返回值 
}

/*测试用的主程序*/
function make_crc()
{
var arr_str=document.getElementById("txt2").value;
var arr=arr_str.split(',');  
var  pCharData = [0x01,0x03,0x00,0x00,0x00,0x02];

var crc=chkcrc(arr,6);//GetQuickCRC16(arr,6);//(pCharData, 6)
 var checkBitLow = (crc & 0xff);
 var checkBitHig = ((crc >> 8) & 0xff);
document.getElementById("result").innerText= '低字节是 '+(checkBitHig).toString(16)+'   高字节是 '+parseInt(checkBitLow).toString(16);
}

function calccrc(crcbuf,  crc)
{
       var i;
       crc = crc ^ crcbuf;

       for (i = 0; i < 8; i++)
       {
              var chk;
              chk = crc & 1;
              crc = crc >> 1;
              crc = crc & 0x7fff;

              if (chk == 1)
              { crc = crc ^ 0xa001;}

              crc = crc & 0xffff;
       }
       return crc;
}
/*直接计算 CRC16 (Modbus)*/
function chkcrc(buf,  len)
{
       var hi, lo;
      var i;
       var crc;
       crc = 0xFFFF;

       for (i = 0; i < len; i++)
       {
              crc = calccrc(buf[i], crc);            
       }

       hi = crc % 256;
       lo = crc / 256;
       crc = (hi << 8) | lo;
       return crc;
}
</script>
</body>
</html>

在web页上的计算结果如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/647201.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[golang 微服务] 6. GRPC微服务集群+Consul集群+grpc-consul-resolver案例演示

一. GRPC微服务集群概念 上一节讲解了consul集群: [golang 微服务] 5. 微服务服务发现介绍,安装以及consul的使用,Consul集群,这样的话,当一台server挂掉之后,集群就会从另一台server中获取服务,这就保证了客户端访问consul集群的负载均衡性. 这里还有一个问题: 就是当终端的对…

opencv初学记录

准备工作&#xff1a; 1.找一张图片 2.准备python运行环境&#xff0c;并导入库&#xff0c;pip install opencv-python 读取文件&#xff0c;并打印维度 import cv2 #为什么是cv2不是cv呢&#xff0c;这个2指的是c的api&#xff0c;是为了兼容老板&#xff0c;cv指的就是c&am…

设计模式(十七):行为型之状态模式

设计模式系列文章 设计模式(一)&#xff1a;创建型之单例模式 设计模式(二、三)&#xff1a;创建型之工厂方法和抽象工厂模式 设计模式(四)&#xff1a;创建型之原型模式 设计模式(五)&#xff1a;创建型之建造者模式 设计模式(六)&#xff1a;结构型之代理模式 设计模式…

强化学习笔记-12 Eligibility Traces

前篇讨论了TD算法将MC同Bootstrap相结合&#xff0c;拥有很好的特性。本节所介绍的Eligibility Traces&#xff0c;其思想是多个TD(n)所计算预估累积收益按权重进行加权平均&#xff0c;从而得到更好的累积收益预估值。 价值预估模型的参数更新式子可以调整为&#xff1a; 1. O…

Vue CLI $nextTick 过渡与动画

3.12.$nextTick 这是一个生命周期钩子 **this.$nextTick(回调函数)**在下一次DOM更新结束后执行其指定的回调 什么时候用&#xff1a;当改变数据后&#xff0c;要基于更新后的新DOM进行某些操作时&#xff0c;要在nextTick所指定的回调函数中执行 使用 $nextTick 优化 Todo…

【UE 从零开始制作坦克】2-控制坦克移动(简单的移动效果)

效果 步骤 1. 新建蓝图类&#xff0c;父类选择“VehicleWheel&#xff08;载具车轮&#xff09;” 这里就命名为“TankWheel” 双击打开“TankWheel”&#xff0c;设置形状半径为40 2. 打开 “BP_West_Tank_M1A1Abrams” 选中“网格体&#xff08;VehicleMesh&#xff09;&…

DeepSurvk部署教程

DeepSurvk部署教程 作者:千树、Totoro github项目地址 https://github.com/arturomoncadatorres/deepsurvk Pypi项目地址 https://pypi.org/project/deepsurvk/ 一、DeepSurvk简介 项目作者原话(翻译) DeepSurv 是一种 Cox 比例风险深度神经网络&#xff0c;用于模拟患者协变…

某网站指纹反爬处理

一、问题分析 【疑惑】&#xff1a;使用python的requests库发起get或post请求返回403代码错误&#xff0c;使用postman发起请求发现状态码<200>竟然成功了。这是什么原因&#xff1f;首先排除ip问题&#xff0c;ip有问题的话postman也访问不了。难道是headers出现了问题…

VanillaNet实战:使用VanillaNet实现图像分类

文章目录 摘要安装包安装timm安装 grad-cam 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 论文翻译&#xff1a;https://blog.csdn.net/m0_47867638/article/details/131057152 官方源码&#xff1a;https://github.com/huawei-noah/VanillaNet VanillaNet…

【送书福利-第十二期】机工社Python与AI好书来袭!~

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 本文目录 一、前言二、书籍介绍1、认识AI…

SQL Server 数据加密功能解析

数据加密是数据库被破解、物理介质被盗、备份被窃取的最后一道防线&#xff0c;数据加密&#xff0c;一方面解决数据被窃取安全问题&#xff0c;另一方面有关法律要求强制加密数据。SQL Server的数据加密相较于其他数据库&#xff0c;功能相对完善&#xff0c;加密方法较多。通…

技术背后的温度,夸克App升级智能、普惠、公益高考服务

夸克2023高考信息服务进行了全面升级&#xff0c;通过信息查询、填报工具及专家指导等多维度产品及内容&#xff0c;给考生打造个性化、全周期、全链路的智能信息服务&#xff0c;以提升考生和家长志愿决策的效率。 6月14日&#xff0c;夸克App升级智能选志愿、志愿表等高考信息…

【Java基础学习打卡06】编程语言

目录 引言一、计算机语言是什么&#xff1f;二、计算机语言分类三、计算机语言介绍1.C语言2.C语言3.Java语言4.Python语言 总结 引言 本文主要是理解计算机语言是什么&#xff0c;有哪些分类&#xff0c;分类下有哪些编程语言&#xff0c;以及了解主流的编程语言。 一、计算机…

【源码可分享】教你用Python制作自动答题脚本,实现自动答题,100%正确率!

文章目录 前言一、自动答题的原理二、自动答题的步骤三、Python实现自动答题的方法总结 前言 当今社会&#xff0c;人们的生活越来越依赖于计算机技术&#xff0c;而Python作为一种高级编程语言&#xff0c;已经成为了众多程序员的首选语言。Python具有简单易学、代码简洁、可…

【Java基础学习打卡08】Java语言跨平台原理

目录 引言一、Java程序运行机制二、Java虚拟机三、Java跨平台总结 引言 Java语言编程的一大优势便是跨平台&#xff0c;本文将介绍Java语言是如何实现跨平台的。 一、Java程序运行机制 计算机高级语言按照程序的执行方式可以分为编译型语言和解释型语言。 编译型语言&#x…

一、PyTorch基础

一、PyTorch基本操作 1&#xff0c;导包 import torch2&#xff0c;查看版本号 torch.__version__ """ 2.0.1cpu """3&#xff0c;初始化(全零)矩阵 x torch.empty(3,2) x """ tensor([[7.2868e-44, 8.1275e-44],[6.7262e-4…

教你用Fiddler捕获HTTPS请求

安装Fiddler 这里不特别说明了&#xff0c;网上搜索一大把&#xff0c;根据安装引导一步步安装即可。&#xff08;这里采用的是fiddler v4.6&#xff09; 配置Fiddler 1、打开fiddler配置Tools –>Telerik Fiddler Options。 如果你想学习Fiddler抓包工具&#xff0c;我这…

vue基础--重点

&#xff01;1、vue的特性 &#xff01;2、v-model 双向数据绑定指令 &#xff08;data数据源变化&#xff0c;页面变化&#xff1b; 页面变化&#xff0c;data数据源也变化&#xff09; 1、v-model 会感知到 框中数据变化 2、v-model 只有在表单元素中使用&#xff0c;才能…

CSS体验透视效果

CSS体验透视效果 使用css视距属性perspective结合动画效果实现透视效果。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><me…

金融数字化转型将驶向何处?存储如何保驾护航?

文 | 螳螂观察 作者 | 李永华 “XX行业数字化进入深水区”&#xff0c;经常被谈及。 在金融行业&#xff0c;“深水区”说法却很少出现——这里的数字化始终在“深水区”。 作为数字经济的重要组成部分&#xff0c;金融行业一直走在数字化转型的前沿&#xff0c;总是有新的…