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校验值和存储的校验值来验证数据的完整性。
三、Java CRC32算法实现Java提供了java.util.zip.CRC32类来实现CRC32校验算法。
下面是一个使用Java CRC32算法计算校验值的示例代码:```javaimport java.util.zip.CRC32;public class CRC32Example {public static void main(String[] args) {byte[] data = "Hello, CRC32!".getBytes();CRC32 crc32 = new CRC32();crc32.update(data);long checksum = crc32.getValue();System.out.println("CRC32 checksum: " + checksum);}}```在上述示例代码中,首先将要校验的数据转换为字节数组。
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校验码。
(3)用以模2的方式减去y(x),得到二进制多项式。
就是包含了CRC校验码的待发送字符串。
从CRC的编码规则可以看出,CRC编码实际上是将代发送的m位二进制多项式t(x)转换成了可以被g(x)除尽的m+r位二进制多项式,所以解码时可以用接受到的数据去除g(x),如果余数位零,则表示传输过程没有错误;如果余数不为零,则在传输过程中肯定存在错误。
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_TABLE查找表找到该index对应的值。
–更新CRC的值为(CRC32_TABLE[index] XOR (CRC >> 8))。
4.最终CRC的值为0x9E83486F。
所以,字符串”Hello, World!“的CRC32校验和为0x9E83486F。
计算crc32函数

计算crc32函数计算CRC32函数是一种常用的校验算法,它可以对数据进行校验,以确保数据的完整性和一致性。
CRC32是指循环冗余校验码(Cyclic Redundancy Check),它是一种快速且简单的校验算法。
CRC32算法的核心思想是将待校验的数据转化为一个32位的二进制数,并对该二进制数进行一系列的位运算操作,最终得到一个32位的校验码。
这个校验码可以用来比较两段数据是否相同,或者检测数据在传输过程中是否发生了错误。
CRC32算法的具体实现步骤如下:1. 初始化CRC寄存器为全1,即0xFFFFFFFF。
2. 对每个字节进行处理,从高位到低位依次进行以下操作:- 将当前字节与CRC寄存器的低8位进行异或运算。
- 将CRC寄存器右移8位,即丢弃最低位。
- 如果异或结果的最低位为1,将CRC寄存器与一个预设的固定值0xEDB88320进行异或运算。
3. 重复步骤2,直到所有字节处理完毕。
4. 对CRC寄存器进行取反运算,得到最终的32位校验码。
CRC32算法具有以下特点和优势:1. 算法简单快速:CRC32算法的运算过程非常简单,适合在嵌入式设备和计算机系统中使用。
同时,CRC32算法的计算速度也非常快,能够在短时间内完成大量数据的校验。
2. 低冗余:CRC32算法的校验码长度为32位,相对于数据长度来说,冗余度较低。
这意味着CRC32算法可以在保证较高校验能力的同时,节约存储空间。
3. 强校验能力:CRC32算法可以有效地检测数据在传输或存储过程中的错误,无论是单个比特的错误还是多个比特的错误,都有较高的检测概率。
4. 易于实现和使用:CRC32算法的实现相对简单,只需要几行代码即可完成。
同时,CRC32算法也有很多现成的库和工具可以使用,方便集成到各种应用中。
需要注意的是,CRC32算法并不能对数据进行加密,它只是一种校验算法。
在实际应用中,我们可以将CRC32校验码与数据一起传输或存储,接收方在接收到数据后进行CRC32校验,如果校验不通过,则说明数据可能发生了错误。
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除以这个新的二进制数,得到余数为0x0C9F 0x9C3B。
5.将余数0x0C9F 0x9C3B作为校验值。
因此,经过CRC32算法计算,数据0x01 0x02 0x03 0x04的校验值为0x0C9F 0x9C3B。
四、CRC32算法应用举例CRC32算法广泛应用于数据传输和存储的过程中,用于验证数据的完整性。
例如,在网络传输中,发送方可以通过计算数据的CRC32值,将其附加在数据后面一起发送。
python3中crc32校验码计算

python3中crc32校验码计算Python是一种流行的编程语言,广泛应用于各个领域。
在Python3中,有一个非常有用的功能是计算crc32校验码。
本文将介绍crc32校验码的概念、计算方法以及在Python3中的应用。
### 什么是crc32校验码?crc32是循环冗余校验(Cyclic Redundancy Check)的一种常见形式,用于检测数据传输中的错误。
crc32校验码是一个32位的二进制数,通常以十六进制表示。
它通过对数据进行一系列的位运算,生成一个唯一的校验码。
当数据在传输过程中发生变化时,计算出的校验码也会不同,从而可以检测到数据的错误。
### 如何计算crc32校验码?crc32校验码的计算方法相对复杂,但在Python3中,我们可以轻松地使用内置的crc32函数来计算。
crc32函数接受一个字节串作为输入,并返回一个代表校验码的整数。
下面是一个简单的示例,演示如何使用crc32函数计算校验码:```pythonimport zlibdata = b"Hello, world!"crc32_code = zlib.crc32(data)print(hex(crc32_code))```在这个示例中,我们首先导入了zlib模块,其中包含了crc32函数。
然后,我们定义了一个字节串data,表示要计算校验码的数据。
接下来,我们使用crc32函数计算校验码,并将结果存储在crc32_code变量中。
最后,我们使用hex函数将校验码转换为十六进制表示,并打印输出。
### 在Python3中使用crc32校验码crc32校验码在很多领域都有广泛的应用。
例如,它常用于文件校验、数据完整性验证等方面。
在Python3中,我们可以利用crc32校验码来验证文件的完整性。
下面是一个示例,演示如何使用crc32校验码来检查文件是否被篡改:```pythonimport zlibdef check_file_integrity(file_path):with open(file_path, "rb") as file:data = file.read()crc32_code = zlib.crc32(data)return crc32_code == 0file_path = "example.txt"is_integrity = check_file_integrity(file_path)if is_integrity:print("文件完整性验证通过")else:print("文件已被篡改")```在这个示例中,我们定义了一个check_file_integrity函数,它接受一个文件路径作为参数,并返回一个布尔值,表示文件是否完整。
CRC32校验码算法

CRC32校验码算法由于项目需要,解决一个流媒体文件的crc32校验码。
网上查了很多的资料,发现了此校验码和生成多项式以及算法本身都有关系。
对于不同类型的文件所使用的多项式以及算法不同,对于不同的生成多项式所生成的crc32表不同,不同的算法也会产生不同的结果。
下面分类比较两种不同用途的crc32校验码的计算方法。
1、普通文件(如压缩文件)的crc32校验码计算方法:生成多项式采用0xEDB88320,所生成的表为:/*This polynomial ( 0xEDB88320L) DOES generate the same CRC values as ZMODEM and PKZIP*/typedef unsigned int u_int32_t ;typedef unsigned char u_char;static const u_int32_t crc32tab[] = {0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL,0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L,0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L,0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L,0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L,0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL,0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L,0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L,0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L,0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L,0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL };所使用的算法:u_int32_t ssh_crc32(const u_char *buf, u_int32_t size){u_int32_t i, crc;crc = 0xFFFFFFFF;for (i = 0; i < size; i++)crc = crc32tab[(crc ^ buf[i]) & 0xff] ^ (crc >> 8);return crc^0xFFFFFFFF;}2、媒体文件(如mpeg)的crc32校验码计算方法:生成多项式采用0x04c11db7,所生成的表为:/*This polynomial (0x04c11db7) is used at: AUTODIN II, Ethernet, & FDDI*/typedef unsigned int u_int32_t ;typedef unsigned char u_char;static u_int32_t crc32table[256] = {0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4};所使用的算法是:u_int32_t mpeg_crc32(const u_char *data, int len){int i;u_int32_t crc = 0xFFFFFFFF;for(i = 0; i < len; i++)crc = (crc << 8) ^ crc32table[((crc >> 24) ^ *data++) & 0xFF];return crc;}。
- 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
参考文献
CSDN博客/augusdi/article/details/5694264百度百科CRC冗余校验码。