硬汉嵌入式论坛

 找回密码
 立即注册
查看: 683|回复: 11
收起左侧

[有问必答] CRC查表法中的表是怎么生成的?

[复制链接]

23

主题

58

回帖

127

积分

初级会员

积分
127
发表于 2024-1-19 08:43:33 | 显示全部楼层 |阅读模式

这两个数值不一致呀。是不是可以理解为查表法与直接计算少了中间的移位操作?






回复

使用道具 举报

7

主题

48

回帖

69

积分

初级会员

积分
69
发表于 2024-1-19 21:29:20 来自手机 | 显示全部楼层
帮顶,猜想绝对与多项式和种子值相关
回复

使用道具 举报

23

主题

58

回帖

127

积分

初级会员

积分
127
 楼主| 发表于 2024-1-24 18:12:39 | 显示全部楼层
lb1057907736 发表于 2024-1-19 21:29
帮顶,猜想绝对与多项式和种子值相关

可是这种不是标准的吗?
回复

使用道具 举报

7

主题

48

回帖

69

积分

初级会员

积分
69
发表于 2024-1-24 21:35:54 来自手机 | 显示全部楼层
理论上可以自定义多项式和种子值。现在很多单片机都配备了硬件CRC模块。软件查表也很快,仅次于硬件。想知道表是怎么来得,必须深刻理解原理,根据多项式公式和种子值,写程序自动输出。CRC原理蛮复杂的,大部分人只会用。网上自己搜吧。
回复

使用道具 举报

0

主题

40

回帖

40

积分

新手上路

积分
40
发表于 2024-1-25 20:57:16 | 显示全部楼层
lb1057907736 发表于 2024-1-24 21:35
理论上可以自定义多项式和种子值。现在很多单片机都配备了硬件CRC模块。软件查表也很快,仅次于硬件。想知 ...

CRC原理蛮复杂倒算不上吧,本质上还是移位跟异或。以前算过CRC16,只留了一张表。(不会添加图片,捂脸)

题主若是有兴趣研究这些,可以下载个 CryTool 试试看,或许能用上。


回复

使用道具 举报

0

主题

40

回帖

40

积分

新手上路

积分
40
发表于 2024-1-26 10:55:40 来自手机 | 显示全部楼层
手机浏览器可以上传图片,crc16
ba475e572v4373c910a9a663d138bfc6.png
回复

使用道具 举报

0

主题

40

回帖

40

积分

新手上路

积分
40
发表于 2024-1-26 11:01:03 | 显示全部楼层
必应搜索 how to generate crc table,github 有个仓库 https://github.com/ETLCPP/crc-table-generator

使用的是 CodeBlocks 的 cbp 工程,试了下,题主的图 2 (0000 C0C1 C181 0140)可能是 crc16-arc 格式

粘贴下运行结果

\Github\crc-table-generator\bin\Debug>crc-table.exe crc16-arc

Generating CRC table for crc16-arc

0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040,

不过比图 2 多出了 4 行, 共 64 Words,爱莫能助了。
回复

使用道具 举报

23

主题

58

回帖

127

积分

初级会员

积分
127
 楼主| 发表于 2024-1-30 09:15:57 | 显示全部楼层
cdr430 发表于 2024-1-26 11:01
必应搜索 how to generate crc table,github 有个仓库 https://github.com/ETLCPP/crc-table-generator

...

图二是图一的结果
回复

使用道具 举报

23

主题

58

回帖

127

积分

初级会员

积分
127
 楼主| 发表于 2024-1-30 09:21:39 | 显示全部楼层
cdr430 发表于 2024-1-25 20:57
CRC原理蛮复杂倒算不上吧,本质上还是移位跟异或。以前算过CRC16,只留了一张表。(不会添加图片,捂脸) ...

crytool里没有modbus crc-16的。
回复

使用道具 举报

23

主题

58

回帖

127

积分

初级会员

积分
127
 楼主| 发表于 2024-1-30 09:29:30 | 显示全部楼层
cdr430 发表于 2024-1-25 20:57
CRC原理蛮复杂倒算不上吧,本质上还是移位跟异或。以前算过CRC16,只留了一张表。(不会添加图片,捂脸) ...

这软件不懂怎么设置显示crc每步的计算结果
回复

使用道具 举报

8

主题

157

回帖

181

积分

初级会员

积分
181
发表于 2024-1-30 10:49:54 | 显示全部楼层
我们以CRC-32为例,来演示如何使用CRC查表法进行校验。

初始化表格:
创建一个256个元素的表格,每个元素的初始值为0。

生成多项式:
CRC-32使用的生成多项式为0x04C11DB7。

遍历256个可能的字节值:
对于0到255之间的每个可能的8位字节值,进行如下操作:

假设当前字节值是0xAB(十进制为171)。
将0xAB左移8位并与生成多项式0x04C11DB7进行异或运算,得到一个新的32位值。
重复8次(因为一个字节有8位),每次都将CRC右移1位,并检查最低位是否为1。
如果最低位为1,则将CRC右移1位并与预定义的常数0xEDB88320进行异或操作。
如果最低位为0,则只将CRC右移1位。
这样,针对每个字节值,都会得到一个32位的CRC值。

将计算结果填充到表格中:
将每个字节值所对应的CRC计算结果填充到表格中的相应位置。例如,对于字节值0xAB,计算得到的CRC值是0x5F06DCD9,将其填充到表格的索引位置AB处。

完成上述步骤后,就得到了一个完整的CRC查表表格。

在实际使用中,假设我们有一段数据:0x4D 0x61 0x72 0x79 ("Mary"的ASCII码)。

初始化CRC值为0xFFFFFFFF(即32个1)。

针对每个字节值进行计算:

取出当前字节值,例如0x4D。
通过查表法,在表格中查询到索引值为0x4D的CRC值(假设为0x7EBD7C06)。
将CRC值与查询到的CRC值进行异或操作。
继续处理下一个字节值,重复上述步骤。
最终得到的CRC值就是校验结果。

使用CRC查表法能够快速高效地计算出校验结果,并且具有较好的错误检测能力。
回复

使用道具 举报

0

主题

40

回帖

40

积分

新手上路

积分
40
发表于 2024-1-30 14:34:44 | 显示全部楼层
Y1ng 发表于 2024-1-30 09:21
crytool里没有modbus crc-16的。

再去看看,在 CRC-24/XMODEM 的上面
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 18:33 , Processed in 0.197877 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表