-
2021-05-26 17:21:23
#include <stdio.h> #include <stdlib.h> unsigned short getCRC16(unsigned char *ptr,unsigned char len) { unsigned char i; unsigned short crc = 0xFFFF; if(ptr==0) { return 0; } if(len==0) { len = 1; } //if(len<=255) { while(len--) { crc ^= *ptr; for(i=0; i<8; i++) { if(crc&1) { crc >>= 1; crc ^= 0xA001; } else crc >>= 1; } ptr++; } } return(crc); } int main(void) { unsigned short rc = 0; unsigned char num[6] ={0x02,0x06,0x01,0x07,0x00,0x01}; rc = getCRC16(num,sizeof(num)); printf("rc = %04X\r\n",rc); printf("rc_low = %02X\r\n",*((unsigned char *)&rc)); printf("rc_high = %02X\r\n",*(((unsigned char *)&rc)+1)); }
更多相关内容 -
CRC8/CRC16/CRC32常见几个标准的算法及C语言实现
2019-03-15 16:25:40用表驱动法来实现CRC8、CRC16、CRC32的数据校验,程序简洁,通俗易懂 -
CRC校验算法-C语言
2020-11-22 16:29:54C语言实现各种CRC算法。编译环境:VS2010。请参考我的博客https://blog.csdn.net/u013073067/article/details/86621770 分析代码 -
crc8的校验算法(c语言)
2010-04-29 11:46:51crc8的校验算法的源代码,用C语言编写的 -
CRC校验算法——C语言实现
2022-03-02 10:17:53CRC校验的作用: 一般用于通信过程中,验证数据完整性;数据有无丢失。 校验原理&程序设计流程图 C程序验证 源码 #include <stdio.h> unsigned short RTU_CRC( unsigned char * puchMsg, unsigned ...CRC校验的作用:
一般用于通信过程中,验证数据完整性;数据有无丢失。
校验原理&程序设计流程图
CRC16——C程序验证
- 源码
#include <stdio.h> unsigned short RTU_CRC( unsigned char * puchMsg, unsigned short usDataLen ); int main(){ int DateLen=11; unsigned char crc[] = {0x0B,0xC1,0x08,0x21,0x92,0x64,0x10,0xD1,0x02,0x01,0x02}; //check:AE B1" 校验位,校验结果 for (int i=0; i<DateLen; i++){ printf("%02X",crc[i]); } printf("---CRC check = %0X", RTU_CRC(crc,DateLen)); return 0; } // crc校验表 static const unsigned char auchCRCHi[] = { 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}; // ----------------------------------------------------------------------------- // DESCRIPTION: RTU CRC 3校验的低位字节表3 // ----------------------------------------------------------------------------- static const unsigned char auchCRCLo[] = { 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}; // 3校验函数3 /*nodebug*/ unsigned short RTU_CRC( unsigned char * puchMsg, unsigned short usDataLen ) { unsigned char uchCRCHi; // high 字节 of CRC initialized unsigned char uchCRCLo; // low 字节 of CRC initialized unsigned uIndex; // will index into CRC lookup table uchCRCHi = 0xFF; uchCRCLo = 0xFF; while ( usDataLen-- ) { // calculate the CRC uIndex = uchCRCLo ^ (unsigned char)( *puchMsg++ ); uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex]; uchCRCHi = auchCRCLo[uIndex]; } return ( uchCRCHi << 8 | uchCRCLo ); }
-
执行结果
0BC10821926410D1020102---CRC check = AEB1
-
CRC16校验C语言程序源码(附完整的可执行的C语言代码).pdf
2021-09-30 16:33:56CRC16校验C语言程序源码(附完整的可执行的C语言代码).pdf -
crc8校验算法 c语言_如何批量校验身份证号码是否正确有效?
2020-11-02 22:15:07信息表片段顿时只觉眼前一片黑压压的18位阿拉伯数字排山倒海之势正要压倒右手掌心的鼠标红点,说时迟那是快,立刻掏出多年陪伴的女朋友,哦不,是双手,一串清澈的ABC从指尖划过,神奇的“身份证号算法”在浏览器...本文是来自公众号粉丝1031(微信号:Vilko-Ra)的投稿。
今天小编接到一个重要任务,检验统计的人员信息里身份证号码的有效性,打开统计表一看,几千行人员信息。
信息表片段
顿时只觉眼前一片黑压压的18位阿拉伯数字排山倒海之势正要压倒右手掌心的鼠标红点,说时迟那是快,立刻掏出多年陪伴的女朋友,哦不,是双手,一串清澈的ABC从指尖划过,神奇的“身份证号算法”在浏览器搜索页闪亮着光芒。
前17位数分别【乘以不同的系数】,【结果相加】,【除以11】取余数,【查校验码】。你一定是:一脸懵逼,忍不住提高嗓门,胸肌一震动,一颗“what?”掷地有声。我露出咬过无数次筷子的一字大白牙,弯腰45°,双手举过头顶,奉上准备已久的算法图表。可见以上身份证号码第18位“X”与校验码“9”不符,校验错误。
相信聪明的你已经看清了小编的明亮眼睛,拿出了蠢蠢欲动的神马计算器,“今天星期四,我要学写字,拿起神马笔,一二三个四……”一边大声喊出口诀,一边狂操信息表。No No No……魅力无穷小小编怎么舍得你受这么大的苦呢,一把“黑十字”嗖嗖飞过来,且看动图:
具体公式如下:
=IF(LEN(C2)=18,IF(RIGHT(C2,1)=MID("10X98765432",1+MOD(SUMPRODUCT(VALUE(MID(C2,ROW($1:$17),1)),系数表!$B$2:$B$18),11),1),"合法","不合法"),"长度错误")
对本文知识点有任何疑问请联系本文作者微信号:Vilko-Ray。作者说了:必知无不言言无不尽,一起成长。(2019年9月14日23点54分完稿)
最后,再次感谢Vilko-Ray的投稿,向大家无私分享自己的经验。
欢迎大家投稿
函数|VBA|图表|数据分析类文章均可
你来编辑,我来排版。
-
CRC8算法c语言源代码
2015-08-11 10:17:34CRC8 的实现算法X2+X+1的源代码。 -
CRC校验的快速算法的C语言实现
2021-05-20 01:47:35CRC校验的快速算法的C语言实现CC R校验的快速算法的C语言实现颜国谷 (中原油田信息中心 4 70 ) 5 0 1摘要:c c R循环冗余校验算法,是一种在数据存储和数据通讯领域中使用十分广泛的编码算法,具有强力的检错和纠错...CRC校验的快速算法的C语言实现
CC R校验的快速算法的C语言实现
颜国谷 (中原油田信息中心 4 70 ) 5 0 1
摘要:c c R循环冗余校验算法,是一种在数据存储和数据通讯领域中使用十分广泛的编码算法,具有强力的检错和纠错能
力,并且开销比较小。本文从 c c本原理出发,介绍了C C速算法的原理,以c言为实现手段,实现了该算法。 R基 E快语 关键字:c c R校验快速 c c并行c c c言 R R语
1引言 .
在数据存储和数据通讯领域,为了保证数据的正确 .就不得不采用检错或者纠错的编码手段。在诸编码方式中,CR C是其中著名的一种,其特点是 .检错能力极强,开销小,易于用编码器及检测电路实现:从其检错能力来看,它所不能
C C成多项式进行模 2,即: R生除
!生
G() x
! M xx ̄生:—(—x )
G x ()
堕
G() z
( 2—2
根据式 2 .可以得到: -1
=++ ㈣ t (—3 2 )
根据,根据相同的序列按位异或的结果为0 .因此 .式
发现的错误的几率仅为 0 0 4%以下。从性能上和开销上考 2 3就可以化为: 07 -的 虑,均远远优于奇偶校验及算术和校验等方式。因而,在数
:
据存储和数据通讯领域,CR都被广泛运用例如,通讯协 c议 X 2的F S帧检错序列 )用的是 C C C T 5 C (采 R - ClT.AR、L A J H等压缩工具软件采用的是 CR 3 .磁盘驱动器的读写采用了 C2
C C通用的图像存储格式 G F IF也都使用 C C为检 R 1 6 I、TF等 R作
(—4) 2
从中就可以看出接收端计算的结果是整除的,没有余数,这也就是 C C接收端判断数据是否正确的标准。 R在
因此整个CR计算过程就是将要发送的信息左移k .然 C位
后将与生成多项式进行模 2除法,等到的 k长的余数就是 C C位 R
校验信息。
错手段。
2C . RC原理
码序列在发送端 .根据已定的生成多项式 .按照一定的规则 .产生一段 k的校验码 (位即CR码 ),附在要发送的信息 c后 .构成一个新的长为 (+ )位的二进制码序列再发送给 nk
C C R的标准是多种多样的,一般是依据生成多项式的长度
R一 .C C 6 CR C校验是一种线性编码理论,对于要传输 n二进制分为C C 8 R 1等 .以下就是几种典型的生成多项式: 位
C (一8:+++1
C尺一1 x+x’ +1 C 6: +
C RC一3工2+ 2: 3 +x+∞ + + +“+。 + + +++x+l
接收端。在接收端则根据接收的数据部分和C C R之间是否预
定的关系,从而判定在传输过程中是否出现传输错误。 CR C的计算是一种模 2除法,与普通的除法主要的差别的是在计算过程中减法 .使用的不借位/位的模 2运算 .等进加
同于按位异或。
3 C C 1快速算法原理 .R -6
在工程运用中 .基于上面介绍的按照模 2法,计算 CR 除 C校验算法的工作量是很大的,特别是对于越长的序列 .因为没 1数据就要进行一个计算。例如一个以太网数据包的包长为
二进制序列数据流,可以用模2多项式表示 .多项式的系
数就是序列的值。如 1 1 1可以表示为: 0 O 1
1 +0×+1 +0X+1 +1× × X
最大为1 1b t .计算这样的~个数据包需要的时间和计算量 ye 58
的花费很多,找到一种快速的C C算方法 (成并行CR算 R计也 C法 ) .对于工程应用是十分有必要的。
可以采用增加每次C C R的输入的数据长度来简化运算需要的时间和运算量 .一般使用 1ye bt输入数据代替 1 t b的输入。
以C C 8 R一为例 .如果要计算~个 1b的数据的C C 8 i 6t R一。
1bt据,为: i 6数记
假设要传输的n长度的二进制序列表示为:位
肘(= ) 。
使用的C C成多项式,记为: R生
G(=&,
M (: ()+ () M× x M。x其CM,) (就是第1 y 8t t6数据, b
(是第 2ye数据。 ) bt的
如果将二进制序列和生成多项式 .进行下面的计算:
M () x x ̄ x
=
那么按照前面介绍的C C R原理 .计算过程 .
㈣+ (~1 2 )
得到的月j就是CR校验码
它的长度应该是比生成多项 () r C
式少~位.要发送的数据就是: ()+R X )。
在接收端 .对数据进行校验就是将接收到数据和已定的
M ) x ( ' xx G()= x
G() x
l (一1 j。
假定 .
1 8科学中国人 2
2 1年第7 00期
-
CRC循环冗余校验算法C语言实现
2011-04-13 13:12:30CRC循环冗余校验算法C语言实现 CRC循环冗余校验算法C语言实现 -
单片机实现CRC32校验C语言算法(大端模式)
2013-05-17 14:05:24用51系列单片机可实现的CRC32校验c语言算法,经测试通过,准确无误,代码占用量少,完全满足单片机的使用! -
C语言 一个crc32校验算法
2022-05-05 17:10:12static const uint32_t crc32tab[] = { 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x... -
crc16校验函数c语言
2014-03-19 09:37:37适用于标准MODBUS通信协议校验,经验证crc16校验吗无误 -
C语言实现CRC16校校验
2018-05-23 13:20:48C语言实现标准CRC16校验 ,文件包含crc.h 和crc.c,有问题可以 私聊我 q-175-543-7233 -
CRC-8/MAXIM校验算法(C语言实现)
2020-10-19 00:24:22CRC,全称“Cyclic ...下面介绍一些常用的生成CRC校验码的C语言实现方式。 CRC-8/MAXIM (笑) 参数模型 NAME x 8+x5+x4+1 宽度 WIDTH 8 多项式 POLY 0x31 初始值 INIT 0x00 结果亦或值 XOROU 0x -
CRC8校验算法总结
2019-09-02 17:37:36最近做项目时,一直在用crc8算法做校验,但是编程平台多样,所以总结一下。使用的多项式是:X8 + X2 + X + 1 1 C语言 /************************************************************* * 函数名称: gh_crc8 * * ... -
单片机CRC8检验C语言实现
2021-05-20 02:27:53CRC校验类型:CRC8/MAXIM多项式:X8+X5+X4+1Poly:0011 0001 0x31高位放到后面就变成 1000 1100 0x8cC现实代码:unsigned char crc8_chk_value(unsigned char *message, unsigned char len){uint8 crc;uint8 i;crc =... -
CRC32校验算法C语言版(查表法)
2016-05-16 17:20:27最近用到CRC校验算法,就找了些资料,学习了一下,网上关于CRC32的资料也多,但感觉不是很完整,或者太高深。 CRC算法查表法很常见,但表是怎么来的,有些资料说得不很清楚。 我来说一下我的看法: 1.CRC校验变化太... -
CRC校验原理及其C语言实现
2020-09-27 22:00:06文章目录目录前言CRC算法简介CRC参数模型CRC计算CRC校验CRC计算的C语言实现CRC计算工具总结参考资料 目录 前言 CRC算法简介 CRC计算 CRC校验 CRC计算的C语言实现 CRC计算工具 总结 前言 最近的工作中,要实现对... -
modbus RTU CRC16校验函数 C语言
2022-03-19 20:45:03modbus RTU CRC16校验函数 C语言 -
CRC校验算法的C语言实现
2021-09-04 15:33:10按照自己的需求修改表里面的数据,即可实现不同的crc校验 -
CRC16校验原理附C语言源码
2018-08-09 10:08:30CRC16校验原理附C语言源码,相信描述CRC16算法原理,附带的C语言代码,可以直接使用 -
CRC校验及C语言实现
2022-02-18 10:44:50摘自:CRC校验原理及其C语言实现 地址:https://blog.csdn.net/whik1194/article/details/108837493?spm=1001.2014.3001.5502 -
Modbus通信协议中CRC校验的快速C语言算法-综合文档
2021-05-14 21:44:49Modbus通信协议中CRC校验的快速C语言算法 -
C语言 单片机CRC8 校验程序
2017-09-19 11:11:16通用单片机CRC8校验程序,用C编写,为标准的多项式=0x31 数据反转:LSB first算法。和PC端典型的多项式=0x31 数据反转:LSB first算法CRC8校验结果算法一致,通用性强,代码简洁。和上位机交换信息时候,有现成的算... -
C语言标准CRC-8校验函数
2022-04-22 08:17:51CRC校验原理及简单CRC-8校验函数(7个输入字节以内)可参考: CRC校验原理及CRC-8校验函数设计 。 这里的函数是实现输入范围扩展,支持任意长度的输入字节的CRC-8校验。 设计原理 设计原理仍然基于无符号64位整型为... -
C语言MD5算法,CRC16校验算法
2021-05-14 15:30:39C语言MD5算法,CRC16校验算法C语言MD5算法,CRC16校验算法MD5算法CRC16校验算法 C语言MD5算法,CRC16校验算法 MD5算法 /* 函数使用说明: 先调用MD5Init初始化一个MD5_CTX类型结构体,再使用MD5Update计算MD5码,... -
CRC4校验C语言源码实现
2021-01-13 09:19:09} //CRC4校验演示 void main() { char inbuf[100], fcs[100]; //输入缓冲区 FCS缓冲区 int i=0,j=0; printf("\n输入M:"); scanf("%s",inbuf); while(inbuf[0]!='0' || inbuf[1]!='\0'){ printf("FCS:"); ...