CRC32 冗余校验码的计算
c++ crc32计算原理
c++ crc32计算原理
CRC32是循环冗余校验(Cyclic Redundancy Check)的一种,
用于检测数据传输或存储过程中的错误。CRC32计算原理涉及到多
项式除法和位操作。
首先,CRC32算法使用一个32位的寄存器来存储中间结果。然后,数据被处理成一个比特流,每一位被依次处理。CRC32算法使
用一个固定的多项式进行计算,通常是0xEDB88320。在计算过程中,数据流的每一个比特被依次与寄存器中的值进行异或操作。如果数
据流的当前比特为1,那么就将寄存器的值与多项式进行异或;如
果当前比特为0,则不进行异或操作。接着,寄存器中的值向右移
动一位,将最右边的比特丢弃,最左边补0。这个过程一直持续到
数据流的每一位都被处理完毕。
在处理完整个数据流后,寄存器中的值就是CRC32校验码。需
要注意的是,在开始计算之前,寄存器中的初始值需要被设定为一
个特定的值,通常是0xFFFFFFFF。此外,在最后输出CRC32值之前,需要对寄存器中的值进行一次取反操作。
总的来说,CRC32的计算原理涉及到多项式除法和位操作,通
过对数据流的每一位进行异或和移位操作,最终得到CRC32校验码。这种算法的优点是计算简单高效,适合硬件实现和嵌入式系统应用。
java crc3216进制数校验算法
java crc3216进制数校验算法
Java CRC32是一种校验算法,用于对数据进行校验和验证。CRC32是循环冗余校验码的32位实现,它通过对数据进行多项式除法运算来生成一个32位的校验值。本文将详细介绍Java CRC32算法的原理、应用及其实现方式。
一、CRC32校验算法原理
CRC32算法是一种循环冗余校验码算法的32位实现。它通过对数据进行多项式除法运算,得到一个32位的校验值。具体的原理如下:
1. 初始化CRC寄存器的值为全1(32个1)。
2. 将要校验的数据的每个字节与CRC寄存器的值进行异或运算。
3. 将CRC寄存器的值右移8位,并用一个预设的多项式(通常是0xEDB88320)进行异或运算。
4. 重复步骤2和3,直到所有的数据字节都被处理过。
5. 最终得到的CRC寄存器的值即为校验值。
二、CRC32校验算法应用
CRC32校验算法在数据传输和存储中广泛应用,其中一些常见的应用包括:
1. 数据完整性校验:通过计算数据的CRC32校验值,可以验证数据在传输或存储过程中是否发生了错误或损坏。
2. 文件校验:在下载文件或拷贝文件时,可以通过比较源文件和目
标文件的CRC32校验值来判断文件是否完整无误。
3. 网络通信:在网络通信中,通过计算发送数据的CRC32校验值,接收方可以验证接收到的数据的完整性。
4. 数据库校验:在数据库中存储数据的同时,可以计算数据的CRC32校验值,并将其与存储的数据一起存储。当需要读取数据时,可以通过比较计算得到的CRC32校验值和存储的校验值来验证数据的完整性。
crc32公式
crc32公式
CRC32公式
介绍
CRC32是一种循环冗余校验算法,常用于数据校验和错误检测。它通过生成一个32位的校验值,用于验证数据在传输或存储过程中是否出现错误或被篡改。下面列举一些与CRC32相关的公式,并举例解释说明。
CRC32计算公式
以下是CRC32计算的一般公式:
CRC = CRC_INITIAL_VALUE for each byte in data: index = (CRC XOR byte) AND 0xFF CRC = (CRC32_TABLE[index] XOR (CRC >> 8))
其中,CRC_INITIAL_VALUE是初始值,CRC32_TABLE是一个预先计算好的查找表,用于加速计算过程。
CRC32验证公式
CRC32的验证公式与计算公式类似:
CRC = CRC_INITIAL_VALUE for each byte in data: index = (CRC XOR byte) AND 0xFF CRC = (CRC32_TABLE[index] XOR (CRC >> 8))
如果CRC最终的值等于预期的校验和值,那么数据经过校验。
示例
假设我们要计算字符串”Hello, World!“的CRC32校验和。
1.初始化CRC的值为0xFFFFFFFF。
2.将字符串转换为字节数组:[72, 101, 108, 108, 111, 44, 32,
87, 111, 114, 108, 100, 33]
3.依次处理每个字节:
–计算index = (CRC XOR byte) AND 0xFF。
crc32算法c语言
crc32算法c语言
摘要:
1.算法介绍
a.CRC32的背景和起源
b.CRC32的作用和应用场景
2.CRC32算法原理
a.CRC32的编码方式
b.CRC32的计算方法
c.CRC32的校验过程
3.CRC32在C语言中的实现
a.CRC32的C语言函数
b.CRC32的计算示例
4.CRC32算法的优缺点
a.CRC32的优点
b.CRC32的缺点
5.总结
正文:
CRC32算法是一种广泛应用于数据校验的编码方式,它的全称是循环冗余校验32位,起源于CRC(Cyclic Redundancy Check,循环冗余校验)算法。CRC32主要用于检测数据传输或存储中的错误,确保数据的正确性和完整性。
CRC32算法的原理是基于二进制多项式除法,其计算过程是将需要校验的数据用二进制表示,然后用一个生成多项式去除这个二进制数据。这里的生成多项式是一个32位的二进制数,它决定了CRC32算法的编码方式。计算过程中,得到的余数就是校验码,可以附加在原始数据后面进行传输或存储。在接收端,使用相同的生成多项式和计算方法,对收到的数据进行CRC32校验,如果计算出的校验码与接收到的校验码相同,说明数据传输或存储正确,否则就存在错误。
在C语言中,我们可以通过编写代码实现CRC32算法。以下是一个简单的CRC32计算函数示例:
```c
unsigned int crc32(unsigned char *data, int length) {
unsigned int crc = 0xFFFFFFFF;
for (int i = 0; i < length; i++) {
crc32算法与示例
crc32算法与示例
CRC32算法是一种常用的校验算法,它可以用来验证数据的完整性。本文将介绍CRC32算法的原理和示例,帮助读者理解并应用这一算法。
一、CRC32算法概述
CRC32算法是循环冗余校验(Cyclic Redundancy Check)的一种变种。它通过对数据进行多项式除法运算,得到一个32位的校验值。这个校验值可以用来验证数据在传输或存储过程中是否发生了错误。
二、CRC32算法原理
CRC32算法的核心思想是将数据看成一个二进制数,然后通过除法运算得到校验值。具体步骤如下:
1.选择一个32位的生成多项式,通常取0x04C11DB7。
2.将数据看成一个二进制数,按照最高位在前的顺序排列。
3.在数据的最高位补32个0,得到一个新的二进制数。
4.用生成多项式除以这个新的二进制数,得到余数。
5.将余数作为校验值。
三、CRC32算法示例
为了更好地理解CRC32算法,下面举一个简单的示例。
假设我们要发送一个包含4个字节的数据:0x01 0x02 0x03 0x04。1.我们首先选择生成多项式0x04C11DB7。
2.将数据看成一个二进制数,按照最高位在前的顺序排列得到:00000001 00000010 00000011 00000100。
3.在数据的最高位补32个0,得到一个新的二进制数:00000000 00000000 00000000 00000001 00000000 00000010 00000011 00000100。
4.用生成多项式0x04C11DB7除以这个新的二进制数,得到余数为
python3中crc32校验码计算
python3中crc32校验码计算
Python是一种流行的编程语言,广泛应用于各个领域。在Python3中,有一个非常有用的功能是计算crc32校验码。本文将介绍crc32校验码的概念、计算方法以及在Python3中的应用。
### 什么是crc32校验码?
crc32是循环冗余校验(Cyclic Redundancy Check)的一种常见形式,用于检测数据传输中的错误。crc32校验码是一个32位的二进制数,通常以十六进制表示。它通过对数据进行一系列的位运算,生成一个唯一的校验码。当数据在传输过程中发生变化时,计算出的校验码也会不同,从而可以检测到数据的错误。
### 如何计算crc32校验码?
crc32校验码的计算方法相对复杂,但在Python3中,我们可以轻松地使用内置的crc32函数来计算。crc32函数接受一个字节串作为输入,并返回一个代表校验码的整数。
下面是一个简单的示例,演示如何使用crc32函数计算校验码:
```python
import zlib
data = b"Hello, world!"
crc32_code = zlib.crc32(data)
print(hex(crc32_code))
```
在这个示例中,我们首先导入了zlib模块,其中包含了crc32函数。然后,我们定义了一个字节串data,表示要计算校验码的数据。接下来,我们使用crc32函数计算校验码,并将结果存储在crc32_code变量中。最后,我们使用hex函数将校验码转换为十六进制表示,并打印输出。
crc32算法与示例
crc32算法与示例
CRC32算法是一种常用的循环冗余校验算法,用于数据的完整性校验。它通过生成一个32位的校验码,可以在数据传输过程中检测出数据是否被篡改。本文将介绍CRC32算法的原理和示例。
一、CRC32算法的原理
CRC32算法是基于多项式除法的思想,它将待校验数据看作一个多项式,通过除法运算得到余数作为校验码。具体步骤如下:
1. 初始化CRC寄存器为全1,表示一个全1的二进制数。
2. 从高位到低位依次处理每个数据位。
3. 如果当前数据位为1,将CRC寄存器与一个预设的固定值(生成多项式)进行异或运算。
4. 将CRC寄存器向右移一位,丢弃最低位,并将新的最高位补充为0。
5. 重复第2步到第4步,直到处理完所有的数据位。
6. 得到的CRC寄存器的值就是校验码。
二、CRC32算法的示例
为了更好地理解CRC32算法,我们以一个简单的示例进行说明。假设我们要传输一个8位的数据,为了保证数据的完整性,我们使用CRC32算法进行校验。
1. 假设我们要传输的数据为10101100。
2. 我们选择的生成多项式为CRC32_POLYNOMIAL = 0xEDB88320(十
六进制表示)。
3. 初始化CRC寄存器为全1,即CRC = 0xFFFFFFFF。
4. 从高位到低位依次处理每个数据位。
- 处理第一个数据位1:
- 将CRC寄存器与生成多项式进行异或运算:CRC = CRC ^ CRC32_POLYNOMIAL = 0xFFFFFFFF ^ 0xEDB88320 = 0x3D5CDD04。
- 将CRC寄存器向右移一位,丢弃最低位,并将新的最高位补充为0:CRC = 0x9AE6EE82。
crc32算法c语言
crc32算法c语言
CRC32是循环冗余校验的一种方法,它常被用于数据传输或存储时的错误检测。CRC32算法的基本思想是将数据看作是二进制码流,利用生成多项式进行位运算,最终得到一个校验值(CRC值)。本文将详细介绍CRC32算法的原理和实现。
1. CRC32算法原理
CRC32算法的主要原理是将待校验数据(原始数据)与一个预设的生成多项式进行异或运算,得到一个新的值。这个值就是CRC值。具体步骤如下:
1.初始化一个全为1的寄存器,用于存储校验结果。
2.将待校验数据的每个字节与寄存器最低位进行异或运算,然后将寄存器向右移1位。
3.如果异或结果为1,那么将一个预设的生成多项式与寄存器进行异或运算。
4.重复步骤2和步骤3,直到处理完所有的数据字节。
5.最终的寄存器值就是CRC值。
2. CRC32算法实现
下面是使用C语言实现CRC32算法的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
uint32_t crc32(const uint8_t *data, size_t size) {
uint32_t crc = 0xFFFFFFFF;
static const uint32_t crc32Table[256] =
{
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
crc爆破宽高例题
crc爆破宽高例题
以下是一个使用CRC爆破来获取原始宽高的例子:
假设我们有一个宽高被修改的PNG图片,其IHDR段的原始数据为"width 200 height 100",经过修改后,该段数据被更改为"width 201 height 101"。我们可以使用CRC32算法来计算原始数据和修改后数据的校验码,并根据校验码的差异来计算出原始的宽和高。
具体步骤如下:
计算原始数据的CRC32校验码:CRC32(原始数据) = xx xx。
计算修改后数据的CRC32校验码:CRC32(修改后数据) = yyyy。
由于修改了宽和高,导致CRC32校验码发生了变化,假设变化值为z,即CRC32(修改后数据) = CRC32(原始数据) + z。
由于CRC32是针对字节流进行计算的,因此我们需要将"width 200 height 100"和"width 201 height 101"转换为字节流形式,并计算出它们的CRC32值。
假设原始数据的CRC32值为a,修改后数据的CRC32值为b,则有b = a + z。
由于CRC32是循环冗余校验码,因此可以通过反向计算来还原出原始数据。具体来说,我们可以通过不断尝试不同的宽和高组合,直到计算出的CRC32值等于a为止。
当计算出的CRC32值等于a时,我们就得到了原始的宽和高,即"width 200 height 100"。
需要注意的是,由于PNG图像的压缩算法会对数据进行一定的处理,因此计算出的CRC32值可能会有一定的误差。在实际应用中,我们需要根据具体情况进行多次尝试和调整,才能准确地还原出原始的宽和高。
crc32校验算法的检测概率计算
crc32校验算法的检测概率计算
获取crc32校验算法的检测概率,需要了解校验算法的特性以
及待校验数据的特征。
CRC32是一种循环冗余校验算法,它通过对待校验数据进行
多项式除法运算得到余数,然后将余数作为校验码。CRC32
校验算法具有好的特性,例如易于实现、高效性能、良好的错误检测能力等。
根据CRC32的特性和待校验数据的特征,可以计算出其检测
概率。具体计算方法如下:
1. 假设待校验数据的比特数为n。
2. 设CRC32校验码长度为32比特。
3. 计算待校验数据的多项式除法的余数bit数r = 32。
4. 计算校验概率P = (1 - 2^(-r)) ^ n。
其中,P表示CRC32校验算法的检测概率,n表示待校验数据的比特数,r表示余数bit数。
需要注意的是,以上计算结果只是理论上的检测概率。实际上,CRC32校验码可能会受到其他因素的影响,例如数据传输过
程中的噪声、误码率等。因此,在实际应用中,还需综合考虑这些因素,进行实际测试和验证。
crc32 计算 c语言
crc32 计算 c语言
CRC32是一种循环冗余校验算法,用于检测数据传输中的错误。在
计算机领域中,CRC32常被应用于数据校验和数据完整性验证的场景。本文将介绍CRC32的计算原理和在C语言中的实现方法。
一、CRC32的计算原理
CRC32采用CRC循环冗余校验算法,通过生成多项式的位操作进
行校验计算。它将待校验的数据看做二进制位序列,并通过生成多项
式进行逐位的异或运算,最终得到一个32位的校验值。CRC32算法的
计算过程如下:
1. 初始化校验值为全1的32位二进制数(0xFFFFFFFF)。
2. 将生成多项式(0xEDB88320)左移31位,并作为一个32位二
进制数存入CRC寄存器中。
3. 从待校验数据的最高位开始,依次将每一位与CRC寄存器中的
值进行异或运算。
4. 若当前位为1,则将CRC寄存器的值右移一位并与生成多项式进
行异或运算;若当前位为0,则直接将CRC寄存器的值右移一位。
5. 重复步骤4,直至处理完所有数据位。
6. 最终得到CRC寄存器中的32位二进制数,即为CRC32校验值。
二、C语言中的CRC32计算实现
在C语言中,可以使用位操作来实现CRC32的计算。以下是一个简单的CRC32计算函数的示例代码:
```c
#include <stdint.h>
uint32_t crc32(uint8_t *data, uint32_t length)
{
uint32_t crc = 0xFFFFFFFF;
uint32_t i, j;
for (i = 0; i < length; i++)
crc32 c语言运算实现
crc32 c语言运算实现
摘要:
1.CRC32 的概述
2.C 语言实现CRC32 的方法
3.CRC32 的具体运算过程
4.CRC32 在实际应用中的例子
5.总结
正文:
【1.CRC32 的概述】
CRC32,全称为Cyclic Redundancy Check 32,即32 位循环冗余校验,是一种用于数据传输过程中检测错误的技术。通过在数据后面附加一些校验位,然后接收方在接收到数据后,通过相同的计算方法,对数据进行校验,以判断数据在传输过程中是否发生了改变或错误。
【2.C 语言实现CRC32 的方法】
CRC32 的计算方法有多种,其中较为常见的是使用查表法和公式法。在
C 语言中,可以通过以下步骤实现CRC32 的计算:
1) 首先,需要定义一个256x32 的查错表,用于存储CRC32 的值。
2) 然后,根据待计算的数据,查找查错表,得到对应的CRC32 值。
3) 最后,将该值附加在数据的后面,形成一个新的数据。
【3.CRC32 的具体运算过程】
以查表法为例,假设待计算的数据为1101,首先找到该数据在查错表中
的位置,然后查表得到对应的CRC32 值为0x00000000。接着,将该值附加在数据的后面,得到新的数据为1101000000。此时,再对这个新的数据进行CRC32 的计算,直到整个数据长度达到32 位。这样就可以得到最终的CRC32 校验值。
【4.CRC32 在实际应用中的例子】
在实际应用中,CRC32 广泛应用于数据传输、文件存储等场景。例如,在网络数据传输中,为了保证数据的完整性,可以在数据后面附加CRC32 校验值。接收方在接收到数据后,通过计算CRC32,判断数据是否发生了改变或错误。
CRC32 冗余校验码的计算
F o r p e s n a u s e o n y s u d y a n d r e s a c h n o f r c m me r c a u s e
题目:
校验码的计算
姓名: 周小多
学号:2013302513 班号:10011302 时间:2015.11.1
计算机学院
时间:
目录
摘要
1 目的 (1)
2 要求 (1)
3 相关知识 (1)
4 实现原理及流程图.......................... 错误!未定义书签。
5 程序代码 (7)
6 运行结果与分析 (7)
7 参考文献 (7)
题目:
做这个CRC码的生成多项式。校验码的具体生成过程为:假设要发送的信息用多项式C(X)表示,将C(x)左移R位(可表示成C(x)*2R),这样C(x)的右边就会空出R位,这就是校验码的位置。用 C(x)*2R除以生成多项式G(x)得到的余数就是校验码。
任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。
4、实现原理及流程图
CRC校验码的编码方法是用待发送的二进制数据t(x)除以生成多项式g(x),将最后的余数作为CRC校验码。其实现步骤如下:
(1)设待发送的数据块是m位的二进制多项式t(x),生成多项式为r阶的g(x)。在数据块的末尾添加r个0,数据块的长度增加到m+r位。
(2)用生成多项式g(x)去除,求得余数为阶数为r-1的二进制多项式y(x)。此二进制多项式y(x)就是t(x)经过生成多项式g(x)编码的CRC校验码。
qbytearray 做crc32运算 -回复
qbytearray 做crc32运算-回复
如何使用QByteArray 执行CRC32 运算
在计算机科学中,CRC(循环冗余校验)是一种常用的错误检测技术。CRC32是其中的一种实现方式,它对一串数据进行计算,生成一个32位的校验码,可用于验证数据的完整性。QByteArray是Qt框架中用于处理字节数组的类,提供了丰富的方法和功能。本文将详细介绍如何使用QByteArray执行CRC32运算。
第一步:导入Qt库并声明QByteArray对象
首先,为了使用QByteArray类,我们需要导入Qt库。在C++中,我们可以使用以下语句导入Qt库:
cpp
#include <QByteArray>
接下来,在程序中声明一个QByteArray对象,并将待计算的数据存储在其中。假设我们有一个名为data的字节数组,其中存储了待计算的数据,可以使用以下方式声明并初始化QByteArray对象:
cpp
QByteArray data("Hello, World!");
第二步:计算CRC32校验码
为了计算CRC32校验码,我们可以使用一个现成的开源库。在这个例子中,我们将使用zlib库提供的函数crc32()。首先需要导入zlib库:
cpp
#include <zlib.h>
然后,在程序中调用crc32()函数来计算CRC32校验码:
cpp
uLong crc = crc32(0L, Z_NULL, 0); 初始化CRC32值
crc = crc32(crc, (const Bytef*)data.constData(), data.length()); 计算CRC32校验码
c语言crc32分段计算实现
c语言crc32分段计算实现
CRC32是一种常用的循环冗余校验算法,用于检测数据传输过程中的错误。在某些情况下,传输的数据可能会很大,无法一次性计算CRC32值,因此需要分段计算CRC32。本文将介绍如何用C语言实现CRC32分段计算。
CRC32是通过多项式除法来计算的,其实现过程包括两个步骤:生成CRC表和计算CRC值。首先,我们来介绍如何生成CRC表。
生成CRC表的方法是通过对每个可能的字节值进行循环除法运算,得到对应的CRC值。具体步骤如下:
1. 定义一个256个元素的数组crc_table,用于存储每个字节值对应的CRC值;
2. 初始化一个变量i为0;
3. 进入一个循环,循环条件是i小于256;
4. 在循环中,定义一个临时变量crc为i的值;
5. 进入一个内层循环,循环条件是j小于8;
6. 在内层循环中,如果crc的最高位为1,那么将crc左移1位,并与一个预定义的多项式0xEDB88320进行异或运算;
否则,将crc左移1位;
7. 内层循环结束后,将crc的值存入crc_table数组的第i个位置;
8. 将i加1;
9. 外层循环结束后,crc_table数组中的每个位置都存储了对应字
节值的CRC值。
生成CRC表的代码如下所示:
```c
unsigned int crc_table[256];
void generate_crc_table()
{
unsigned int crc;
int i, j;
for (i = 0; i < 256; i++) {
crc = i;
for (j = 0; j < 8; j++) {
java crc32算法
java crc32算法
CRC32是一种广泛应用于数据校验的算法。CRC代表循环冗余校验(Cyclic Redundancy Check),它通过对每个字节进行计算并生成一个校验码来检测数据是否完整和准确。CRC32算法是CRC算法的一种变体,它使用32位长度的校验码。
CRC32算法主要用于数据传输和存储的校验。在数据传输过程中,发送方会计算数据的CRC32校验码,并附加在数据的末尾。接收方在接收到数据后,同样计算接收到的数据的CRC32校验码,并与发送方附加的校验码进行比较。如果两者相等,说明数据传输没有发生错误;如果不相等,则说明数据传输发生了错误。
CRC32算法基于多项式运算。具体而言,CRC32算法采用了多项式值0xEDB88320作为生成多项式,使用位运算来计算每个字节的校验码。具体的算法步骤如下:
1. 初始化一个32位的记号,记为crc32,初始值为
0xFFFFFFFF。
2. 读取待校验数据的每个字节,记为byte。
3. 将crc32与byte进行异或运算。
4. 循环8次,每次处理一个bit位。
- 如果crc32的最低位为1,则将crc32右移一位并与
0xEDB88320进行异或运算。
- 如果crc32的最低位为0,则将crc32右移一位。
5. 返回最终计算得到的crc32值。
通过上述步骤,就可以得到字节数据的CRC32校验码。需要注意的是,CRC32算法是循环的,即最终计算得到的校验码与初始记号0xFFFFFFFF进行异或运算的结果也是校验码。
CRC32算法具有以下特点:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:
校验码的计算
姓名: 周小多
学号:2013302513 班号:10011302 时间:2015.11.1
计算机学院
时间:
目录
摘要
1 目的 (1)
2 要求 (1)
3 相关知识 (1)
4 实现原理及流程图.......................... 错误!未定义书签。
5 程序代码 (7)
6 运行结果与分析 (7)
7 参考文献 (8)
题目:
的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。校验码的具体生成过程为:假设要发送的信息用多项式C(X)表示,将C(x)左移R位(可表示成C(x)*2R),这样C(x)的右边就会空出R位,这就是校验码的位置。用 C(x)*2R除以生成多项式G(x)得到的余数就是校验码。
任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。
4、实现原理及流程图
CRC校验码的编码方法是用待发送的二进制数据t(x)除以生成多项式g(x),将最后的余数作为CRC校验码。其实现步骤如下:
(1)设待发送的数据块是m位的二进制多项式t(x),生成多项式为r阶的g(x)。在数据块的末尾添加r个0,数据块的长度增加到m+r位。
(2)用生成多项式g(x)去除,求得余数为阶数为r-1的二进制多项式y(x)。此二进制多项式y(x)就是t(x)经过生成多项式g(x)编码的CRC校验码。
(3)用以模2的方式减去y(x),得到二进制多项式。就是包含了CRC校验码的待发送字符串。
从CRC的编码规则可以看出,CRC编码实际上是将代发送的m位二进制多项式t(x)转换成了可以被g(x)除尽的m+r位二进制多项式,所以解码时可以用接受到的数据去除g(x),如果余数位零,则表示传输过程没有错误;如果余数不为零,则在传输过程中肯定存在错误。许多CRC 的硬件解码电路就是按这种方式进行检错的。同时可以看做是由t(x)和CRC校验码的组合,所以解码时将接收到的二进制数据去掉尾部的r位数据,得到的就是原始数据。
为了更清楚的了解CRC校验码的编码过程,下面用一个简单的例子来说明CRC校验码的编码过程。由于CRC-32、CRC-16、CCITT和CRC-4的编码过程基本一致,只有位数和生成多项式不一样。为了叙述简单,用一个CRC-4编码的例子来说明CRC的编码过程。
设待发送的数据t(x)为12位的二进制数据100100011100;CRC-4的生成多项式为g(x)= ,阶数r为4,即10011。首先在t(x)的末尾添加4个0构成,数据块就成了1001000111000000。然后用g(x)去除,不用管商是多少,只需要求得余数y(x)。下表为给出了除法过程。
//reg是一个5 bits的寄存器把reg中的值置0.
把原始的数据后添加r个0. While (数据未处理完) Begin
If (reg首位是1)
reg = reg XOR 0011.
把reg中的值左移一位,读入一个新的数据并置于
register的0 bit的位置。
End
reg的后四位就是我们所要求的余数。
这种算法简单,容易实现,对任意长度生成多项式的G (x)都适用。在发送的数据不长的情况下可以使用。但是如果发送的数据块很长的话,这种方法就不太适合了。它一次只能处理一位数据,效率太低。为了提高处理效率,可以一次处理4位、8位、16位、32位。由于处理器的结构基本上都支持8位数据的处理,所以一次处理8位比较合适。
为了对优化后的算法有一种直观的了解,先将上面的算法换个角度理解一下。在上面例子中,可以将编码过程看作如下过程:
由于最后只需要余数,所以我们只看后四位。构造一个四位的寄存器reg,初值为0,数据依次移入reg0(reg的0位),同时reg3的数据移出reg。有上面的算法可以知道,只有当移出的数据为1时,reg才和g(x)进行XOR运算;移出的数据为0时,reg不与g(x)进行XOR运算,相当与
和0000进行XOR运算。就是说,reg和什么样的数据进行XOR移出的数据决定。由于只有一个bit,所以有种选择。上述算法可以描述如下,
//reg是一个4 bits的寄存器
初始化t[]={0011,0000}
把reg中的值置0.
把原始的数据后添加r个0.
While (数据未处理完)
Begin
把reg中的值左移一位,读入一个新的数据并置于
register的0 bit的位置。
reg = reg XOR t[移出的位]
End
上面算法是以bit为单位进行处理的,可以将上述算法扩展到8位,即以Byte为单位进行处理,即CRC-32。构造一个四个Byte的寄存器reg,初值为0x00000000,数据依次移入reg0(reg的0字节,以下类似),同时reg3的数据移出reg。用上面的算法类推可知,移出的数据字节决定reg 和什么样的数据进行XOR。由于有8个bit,所以有种选择。上述算法可以描述如下:
//reg是一个4 Byte的寄存器
初始化t[]={…}//共有=256项
把reg中的值置0.
把原始的数据后添加r/8个0字节.
While (数据未处理完)
Begin
把reg中的值左移一个字节,读入一个新的字节并置于reg的第0个byte
5、程序代码(以附件形式,编程环境:VC++6.0)
p ro j ect1.1 .cp p测试文件.t xt
6、运行结果与分析
因为该文件大于1500字节故把文件拆分成许多份分别计算CRC