CRC32 数值表 查表
### CRC32数值表查表知识点解析 #### 一、CRC基本概念介绍 循环冗余校验(Cyclic Redundancy Check,简称CRC)是一种数据校验技术,主要用于检测或纠正传输过程中的错误。CRC算法基于多项式除法,通过在发送端计算一个校验值并附加到数据上,接收端再进行同样的计算来验证数据的完整性。 #### 二、CRC32概述 CRC32是一种常用的CRC校验算法,它使用32位的校验码,因此得名CRC32。CRC32广泛应用于文件校验、网络通信等领域,能够有效检测出大多数类型的传输错误。 #### 三、CRC32查表原理与实现 CRC32算法可以通过查表的方式实现加速计算。查表方法的基本思想是预先计算好所有可能的输入值与对应的CRC值之间的关系,并存储在一个表格中。当实际进行CRC计算时,可以直接从表中查找结果,从而大大提高计算效率。 #### 四、CRC32查表实现细节 根据给定的部分代码内容,我们可以进一步了解CRC32查表的具体实现: ##### 1. CRC32多项式定义 CRC32通常使用的多项式为`X^32 + X^26 + X^23 + X^22 + X^16 + X^11 + X^10 + X^8 + X^7 + X^5 + X^4 + X^2 + X + 1`,其二进制表示为`0x04C11DB7`,十进制表示为`1112462623`。需要注意的是,这里的多项式与CRC-16和CRC-CCITT使用的多项式不同,这些差异决定了不同的CRC校验算法。 ##### 2. CRC32查表函数 - `BuildTable32()`:该函数用于构建CRC32查表。具体步骤如下: - 初始化变量`i`、`j`、`nData`和`nAccum`。 - 循环遍历所有可能的输入值(0~255),每次循环时将输入值左移24位得到`nData`。 - 再次循环遍历8次,每次判断最高位是否为1,如果是,则将`nAccum`与多项式进行异或操作;否则仅将`nAccum`左移一位。 - 最终将计算结果存入查表数组`Table_CRC[i]`中。 - `CRC_32()`:该函数用于计算数据流的CRC32校验值。具体步骤如下: - 初始化变量`i`和`nAccum`。 - 调用`BuildTable32()`函数构建CRC32查表。 - 循环遍历输入数据的每个字节,每次将`nAccum`左移8位,并从查表中获取当前字节对应的CRC值,进行异或操作。 - 返回最终的CRC32校验值。 ##### 3. CRC-16与CRC-32对比 虽然部分代码片段提到了CRC-16,但这里主要关注CRC32。两者的主要区别在于: - 多项式不同:CRC-16通常使用`X^16 + X^15 + X^2 + X^0`(CRC-16)或`X^16 + X^12 + X^5 + X^0`(CRC-CCITT)作为多项式。 - 查表大小不同:CRC-16查表只需要16位,而CRC32查表需要32位。 - 计算效率不同:CRC32通常比CRC-16更复杂,但查表方法可以显著提高其计算速度。 #### 五、CRC32查表应用实例 在实际应用中,CRC32查表被广泛应用于各种场景,如文件校验、网络数据包校验等。通过使用预先构建好的CRC32查表,可以在处理大量数据时显著减少计算时间,提高系统的整体性能。 CRC32查表是一种高效的数据校验技术,通过对特定多项式的预计算,可以在实际应用中快速准确地计算出CRC32校验值。这对于确保数据传输的完整性和准确性至关重要。
不久前写一程序时要用到 CRC-16 ,但找来找去只在 UDDF 里找到一个 Delphi 的 CRC-32 程序代码,而且是用
查表法,虽然说查表法速度快,但 256 项 32 位数据我怀疑可能会有输入错误, 让人不是那么放心,而我又不
知道这个表是怎么算出来的。后来我又在一本两年前的笔记本里找到一段关于 CRC 的内容, 也不知是从哪里抄
来的,还好里面有一段程序代码,是 CRC-16 的,这段程序正是产生 CRC 表的, 可是这区区几行的程序(基本
上与下面的 BuilderTable16 函数相同)看得我一头雾水,直到这两天才弄明白, 并据此推出 CRC-32 的算法,
现将全部程序列在下面,并作一些说明以助于理解,不但要知其然,还要知其所以然嘛:
补充:为了使这段程序更加实用,我将其整理为几个单元, 分别用于 Delphi 和 C++Builder 。包括对数据
流 TMemoryStream 和字符串的处理。可以在本站作品中下载。Aug.18-01
补充:后来我又见过了许多 CRC 算法的实现,全都是用已经生成的转换码表来实现的,但奇怪的是很多情况
下,它们生成的 CRC 校验值与我完全不同。经过分析发现它们用的码表除了 CRC-CCITT 的是与我用程序生成一样
以外,其它的都不太一样。以一个加密解密控件中用的代码为例,它的 CRC-16 码表用的多项式似乎不一样,我分
析以后用它的多项式来生成码表,结果也只有一部分与之相同,不知道为什么。而目前广泛使用的 CRC-32 实现则
更奇怪,不论用什么多项式都无法生成那个码表,更特别的是,不知道为什么其 nAccum 的初值不为 0 ,而是 -1
。
不过无论如何, CRC 是用于校验数据完整性的,只要达到这个功能,其具体的值并不重要,这里的程序是根
据与硬件 CRC 校验一样的原理实现的,相信可以达到校验的目的。Aug.17-02
// 注意:因最高位一定为“1”,故略去
const unsigned short cnCRC_16 = 0x8005;
// CRC-16 = X16 + X15 + X2 + X0
const unsigned short cnCRC_CCITT = 0x1021;
// CRC-CCITT = X16 + X12 + X5 + X0,据说这个 16 位 CRC 多项式比上一个要好
const unsigned long cnCRC_32 = 0x04C10DB7;
// CRC-32 = X32 + X26 + X23 + X22 + X16 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X1 + X0
unsigned long Table_CRC[256]; // CRC 表
void BuildTable16( unsigned short aPoly )
{
unsigned short i, j;
unsigned short nData;
unsigned short nAccum;
for ( i = 0; i < 256; i++ )
{
nData = ( unsigned short )( i << 8 );
nAccum = 0;
for ( j = 0; j < 8; j++ )
{
if ( ( nData ^ nAccum ) & 0x8000 )
nAccum = ( nAccum << 1 ) ^ aPoly;
else
nAccum <<= 1;
nData <<= 1;
}
Table_CRC[i] = ( unsigned long )nAccum;
}
}
// 计算 16 位 CRC 值,CRC-16 或 CRC-CCITT
unsigned short CRC_16( unsigned char * aData, unsigned long aSize )
{
unsigned long i;
unsigned short nAccum = 0;
BuildTable16( cnCRC_16 ); // or cnCRC_CCITT
剩余7页未读,继续阅读
- yxldr2023-07-26这个文件中的CRC32数值表很全面,覆盖了各种可能的输入情况,对于开发者来说非常实用。
- 73232023-07-26这个文件对于CRC32查表算法的原理做了简明扼要的介绍,让人一目了然,易于理解。
- 明儿去打球2023-07-26这个文件以简单直接的方式展示了CRC32数值表,无需繁杂的计算,使得使用起来非常便捷。
- 我只匆匆而过2023-07-26这个文件提供了很详细的CRC32数值表,让人对查表算法有了更深入的了解。
- 天眼妹2023-07-26这个文件给出的CRC32数值表可以很好地验证数据的完整性,是编程中值得信赖的工具。
- 粉丝: 9
- 资源: 31
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 白色大气风格的服装设计师模板下载.zip
- 白色大气风格的服装设计网站模板下载.zip
- 白色大气风格的复古设计网站HTML模板.zip
- 白色大气风格的高端西服定制模板下载.zip
- 白色大气风格的高楼大厦建筑网站模板下载.zip
- 白色大气风格的个人博客模板下载.zip
- 白色大气风格的个人简历网页模板下载.zip
- 白色大气风格的个人技能简介模板下载.zip
- 白色大气风格的个人摄影图片博客网站源码下载.zip
- 白色大气风格的个人作品展示html模板.zip
- 白色大气风格的个性设计滑动单页模板.zip
- 白色大气风格的公司企业网站CSS模板下载.zip
- 白色大气风格的公路背景倒计时网站模板.zip
- 白色大气风格的公司投资组合CSS网页模板下载.zip
- 白色大气风格的公司网站模板下载.rar
- 白色大气风格的航天卫星科技网站模板下载.zip