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;}。
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。
- 处理第二个数据位0:- 将CRC寄存器向右移一位,丢弃最低位,并将新的最高位补充为0:CRC = 0x4D737741。
- 处理第三个数据位1:- 将CRC寄存器与生成多项式进行异或运算:CRC = CRC ^ CRC32_POLYNOMIAL = 0x4D737741 ^ 0xEDB88320 = 0xB1E6D063。
crc32校验原理
crc32校验原理
CRC32校验是一种常用的数据校验方法,它可以检测数据传输过程中是否出现了错误。
CRC32校验的原理是通过对数据进行一系列的计算,生成一个32位的校验码,然后将这个校验码附加到数据末尾,接收方在接收到数据后也会进行同样的计算,然后将计算出的校验码与接收到的校验码进行比较,如果相同则说明数据传输过程中没有出现错误,否则说明数据出现了错误。
具体来说,CRC32校验的计算过程如下:
1. 首先需要选择一个生成多项式,这个多项式通常是一个32位的二进制数,例如0x04C11DB7。
2. 将数据按照字节进行分组,每组8位,然后将每组数据与生成多项式进行异或运算,得到一个32位的结果。
3. 将上一步得到的32位结果再次与生成多项式进行异或运算,得到一个新的32位结果。
4. 重复上一步,直到所有的数据都被处理完毕,最终得到的32位结果就是CRC32校验码。
5. 将CRC32校验码附加到数据末尾,发送给接收方。
6. 接收方在接收到数据后,按照同样的方法进行计算,得到一个新的CRC32校验码。
7. 将接收到的CRC32校验码与计算出的校验码进行比较,如果相同则说明数据传输过程中没有出现错误,否则说明数据出现了错误。
总的来说,CRC32校验是一种简单而有效的数据校验方法,它可以在数据传输过程中快速检测出错误,保证数据的完整性和准确性。
crc32计算 c语言
crc32计算 c语言CRC32是一种常用的循环冗余校验算法,常用于数据传输和存储中的错误检测。
C语言中提供了计算CRC32的函数,可以方便地进行校验码的计算。
CRC32的全称是Cyclic Redundancy Check-32,即32位的循环冗余校验。
它通过对数据进行一系列的位操作和异或运算,最终得到一个32位的校验码。
CRC32算法的运算过程比较简单,但却可以很好地检测数据中的错误。
CRC32算法的核心思想是将数据看作是一个二进制多项式,并对这个多项式进行除法运算。
具体而言,CRC32算法通过将数据和一个预设的多项式进行异或运算,并进行一系列的位操作,最终得到一个32位的校验码。
在C语言中,可以使用zlib库中的crc32函数来计算CRC32校验码。
该函数的原型如下:uLong crc32(uLong crc, const Bytef *buf, uInt len);其中,crc是初始的校验码,buf是待计算校验码的数据,len是数据的长度。
函数返回计算得到的CRC32校验码。
下面是一个示例程序,展示了如何使用C语言计算CRC32校验码:```c#include <stdio.h>#include <zlib.h>int main(){const char* data = "Hello, CRC32!";uLong crc = crc32(0L, Z_NULL, 0);crc = crc32(crc, (const Bytef*)data, strlen(data));printf("CRC32: %lu\n", crc);return 0;}```在上述示例程序中,我们首先定义了一个字符串data,然后调用crc32函数计算CRC32校验码,并将结果输出到标准输出。
需要注意的是,CRC32算法是一种纯粹的运算算法,与具体的网络协议或数据格式无关。
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,0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,//以下省略...};for (size_t i = 0; i < size; i++){crc = crc32Table[(crc ^ data[i]) & 0xFF] ^ (crc >> 8);}return crc ^ 0xFFFFFFFF;}int main(){uint8_t data[] = {0x01, 0x02, 0x03, 0x04, 0x05};uint32_t crc = crc32(data, sizeof(data));printf("CRC32: 0x%08X\n", crc);return 0;}```在上述代码中,crc32Table数组是预先生成的CRC表,用来加速计算过程。
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校验码可能会受到其他因素的影响,例如数据传输过
程中的噪声、误码率等。
因此,在实际应用中,还需综合考虑这些因素,进行实际测试和验证。
crc计算公式
crc计算公式CRC(循环冗余校验)是一种校验和算法,常用于数据传输和存储系统中,用于检测数据是否出错。
CRC的计算公式通常包括两个部分,一个是生成多项式( G enerator Polynomial)和一个初始值(Initial Value)。
CRC的计算公式如下:生成多项式:CRC算法使用一个固定的二进制多项式,通常表示为一个二进制数。
例如,常用的CRC-32生成多项式为0x04C11DB7。
初始值:CRC算法使用一个固定的初始值,通常表示为一个二进制数。
例如,CRC-32的初始值为0xFFFFFFFF。
计算过程:将数据按照一定的规则划分为多个字节,每个字节都进行一次异或运算,最后再整体进行一次异或运算。
具体步骤如下:将生成多项式和初始值设为当前值。
将数据按字节划分,每个字节与当前值进行一次异或运算。
将结果作为新的当前值。
重复步骤1-3,直到得到最终的CRC值。
例如,假设要计算一个长度为4字节的数据的CRC-32值,生成多项式为0x04C11DB7,初始值为0xFFFFFFFF。
计算过程如下:将生成多项式和初始值设为当前值:0xFFFFFFFF。
将数据的第一个字节与当前值进行异或运算:0xFFFFFFFF ^ 0x01020304 =0x05060708。
将结果作为新的当前值:0x05060708。
将数据的第二个字节与当前值进行异或运算:0x05060708 ^ 0x090A0B0C =0x0D0E0F0G。
将结果作为新的当前值:0x0D0E0F0G。
将数据的第三个字节与当前值进行异或运算:0x0D0E0F0G ^ 0x11121314 =0x15161718。
将结果作为新的当前值:0x15161718。
将数据的第四个字节与当前值进行异或运算:0x15161718 ^ 0x191A1B1C =0x1D1E1F1G。
将结果作为新的当前值:0x1D1E1F1G。
最终的CRC-32值为:最终的CRC-32值 = 最终的值 = 0x1D1E1F1G。
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. 简单快速:CRC32算法的计算过程简单快速,适用于实时性要求较高的应用场景。
2. 冗余度高:CRC32算法通过生成32位的校验码来检测数据中的错误,其冗余度相比于其他校验算法更高。
3. 易于实现:CRC32算法的实现相对简单,只需要进行位运算和异或运算即可实现。
4. 抗干扰能力强:CRC32算法具有较强的抗干扰能力,能够有效地检测到数据中的错误。
CRC32校验码算法
CRC32校验码算法CRC32(Cyclic Redundancy Check)校验码算法是一种错误检测算法,广泛应用于数据通信和数据存储中。
它基于多项式除法的原理,通过将要传输的数据进行计算,生成一个校验码,发送端和接收端对数据进行校验,以判断数据是否出现错误。
CRC32算法的基本原理是将要传输的数据看作是一个二进制数,除以一个固定的标准多项式(也称为生成多项式),并取余数作为校验码。
在CRC32算法中,标准多项式为0x04C11DB7,该多项式对应着一个32位的二进制数。
具体算法步骤如下:1.初始化:将校验寄存器的初始值设置为0xFFFFFFFF。
2.处理输入数据:从输入数据的最高位开始,依次进行以下操作:-将校验寄存器的最高位移出,与输入数据的当前位进行异或操作。
-如果校验寄存器的最低位为1,则将校验寄存器与标准多项式进行异或操作。
-将校验寄存器向右移动1位。
3.完成处理:当输入数据的所有位都处理完后,将校验寄存器取反作为最终的校验码。
1.算法简单:CRC32算法的实现逻辑相对简单,易于理解和实现。
2.高效性能:CRC32算法的计算速度较快,适用于高速传输和大批量数据校验。
3.强错误检测能力:CRC32算法在数据传输过程中,对于单一比特错误和双比特错误有较高的检测概率,可以有效减少数据传输中的误码率。
4.低冲突概率:CRC32算法生成的校验码具有较低的冲突概率,即不同的数据生成相同的校验码的概率较低。
然而,CRC32算法也存在一些缺点:1.弱错误检测能力:相比于MD5等哈希算法,CRC32算法的错误检测能力较弱,无法检测到所有的错误情况。
2.易被篡改:CRC32算法生成的校验码可以通过简单的替换操作来改变数据的校验结果,容易被恶意篡改。
3.无法纠错:CRC32算法只能检测错误,而无法纠正错误。
一旦数据出现错误,则需要重新传输或进行其他纠错处理。
crc32算法代码
crc32算法代码CRC32算法代码详解CRC32算法是一种常用的校验码生成算法,通常用于数据传输或存储时的完整性校验。
本文将详细介绍CRC32算法的原理和实现,并提供代码示例。
一、CRC32算法原理1.1 概述CRC(Cyclic Redundancy Check)循环冗余校验码,是数据通信领域中最常用的一种错误检测码。
它是一个简单而又快速的算法,能够检测出大部分单比特差错和随机比特差错。
1.2 原理CRC32算法通过对数据进行多项式除法来生成校验码。
具体过程如下:(1)定义一个多项式P(x),例如:x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2+x+1。
(2)将待校验数据D(x)左移n位,使其高位对齐多项式P(x)的最高次幂,其中n为多项式P(x)次数减去1。
(3)将左移后的D(x)与P(x)进行模2除法,得到余数R(x)。
(4)将R(x)作为校验码输出。
二、CRC32算法实现2.1 代码示例以下是使用Python实现CRC32算法的代码示例:```pythonimport binasciidef crc32(data):crc = 0xfffffffftable = [0 for i in range(256)]for i in range(256):c = ifor j in range(8):if c & 1:c = 0xedb88320 ^ (c >> 1)else:c = c >> 1table[i] = cfor byte in data:crc = table[(crc ^ byte) & 0xff] ^ (crc >> 8)return crc ^ 0xffffffffdata = b'hello world'print(hex(crc32(data)))```2.2 实现解析(1)定义变量首先,我们需要定义一个变量crc来存储校验码,初始值为0xffffffff。
crc32标准算法
crc32标准算法CRC32(循环冗余校验32位)是一种基于CRC(循环冗余校验)的校验算法。
CRC校验原理是将数据按照一定的规则进行计算,得到一个固定长度的校验码,将该校验码附加到数据后面一起传输。
接收方在接收到数据后也按照同样的规则计算校验码,然后将计算出的校验码与接收到的校验码进行比较,如果相同,则说明数据传输过程中没有出现错误;如果不同,则说明数据传输过程中出现了错误。
CRC32标准算法的过程如下:1. 首先,需要选择一个生成多项式(Generator Polynomial),这个多项式用于计算CRC32校验码。
常用的生成多项式为0xEDB88320。
2. 初始化校验码为0xFFFFFFFF。
3. 将待校验的数据分成32位一组,如果最后一组不足32位,则用0补齐。
4. 按照以下步骤计算校验码:a. 将生成多项式的32位二进制表示进行逆序排列。
b. 将待校验数据的第一组32位与生成多项式的32位进行异或(XOR)运算。
c. 将结果再与待校验数据的下一组32位进行异或运算,依次类推,直到所有32位数据都参与运算。
d. 最后得到的结果即为CRC32校验码。
5. 将计算得到的CRC32校验码附加到数据后面,一起传输。
接收方收到数据后,按照相同的步骤计算校验码。
如果计算出的校验码与接收到的校验码相同,则说明数据传输过程中没有出现错误;如果不同,则说明数据传输过程中出现了错误。
在实际应用中,为了提高计算效率,通常采用查表法来完成CRC32校验。
接收方预先计算出一个查表,用于快速查找校验码。
这种方法在计算生成多项式时,通常采用0xEDB88320作为生成多项式。
crc32公式
crc32公式摘要:1.CRC32 公式的定义和作用2.CRC32 公式的计算方法3.CRC32 公式在数据传输和存储中的应用4.CRC32 公式的优缺点正文:CRC32(Cyclic Redundancy Check 32,循环冗余校验32 位)是一种用于数据传输和存储的错误检测技术。
通过在数据后面附加一些校验位,然后接收方在接收到数据后,通过相同的计算方法,对数据进行校验,以判断数据在传输过程中是否发生了改变或错误。
CRC32 公式的计算方法是:首先,将需要校验的数据用二进制表示,并在其后面添加32 个0,形成一个新的二进制数。
然后,使用一个128 位的生成多项式(generator polynomial),将这个新的二进制数左移32 位,并用生成多项式进行异或操作。
这个操作需要进行32 次,每次操作后,生成多项式的最低32 位与原始数据的最低32 位进行异或。
最后,将32 次异或操作的结果拼接在一起,形成一个32 位的二进制数,这就是CRC32 校验的结果。
CRC32 公式在数据传输和存储中有广泛的应用。
例如,在网络数据传输中,由于数据可能会受到干扰或出现错误,因此,在发送数据时,附加CRC32 校验位,接收方在接收到数据后,通过CRC32 公式进行校验,可以有效地检测数据是否发生了错误。
在数据存储中,由于磁盘或硬盘可能会出现坏扇区,因此,在存储数据时,附加CRC32 校验位,可以在读取数据时,检测数据是否发生了错误。
CRC32 公式的优点是计算简单,只需要进行异或操作,而且检测效果较好,可以检测出大部分的错误。
缺点是当数据发生大量改变时,CRC32 公式可能无法检测出错误。
此外,由于CRC32 校验位只有32 位,因此,对于大型数据,可能出现校验不准确的情况。
总的来说,CRC32 公式是一种简单有效的错误检测技术,广泛应用于数据传输和存储中。
crc循环冗余校验码计算
crc循环冗余校验码计算循环冗余校验码(Cyclic Redundancy Check,CRC)是一种常用的校验码计算方法,用于检测和纠正数据传输中的错误。
CRC码通过对数据进行多项式除法运算来生成校验码,接收方可以利用校验码进行错误检测。
CRC的计算过程如下:1. 选择一个生成多项式,通常用一个二进制数表示。
常用的生成多项式有CRC-8、CRC-16和CRC-32等。
2. 将待校验的数据按位划分为若干个数据块。
3. 对每个数据块进行以下操作:在数据块的末尾添加与生成多项式位数相同的0。
将生成多项式左移至与数据块长度相同的位数。
将数据块与生成多项式进行异或运算。
4. 将每个数据块的结果进行异或运算,得到最终的校验码。
CRC码的优点是简单、快速,并且能够检测多种错误类型。
它广泛应用于数据通信、存储介质和网络传输等领域。
从多个角度来看,CRC的计算可以有以下几个方面的考虑:1. 生成多项式的选择,不同的生成多项式会导致不同的CRC码计算结果。
生成多项式的选取需要根据具体应用场景和需求进行权衡。
一般来说,生成多项式的位数越高,CRC的检测能力越强,但计算复杂度也会增加。
2. 数据块划分,数据块的划分方式可以影响CRC码的计算结果。
通常情况下,数据块的划分应该合理均匀,以保证CRC码的检测能力。
3. 异或运算,CRC码的计算过程中使用了异或运算,这是一种位运算,可以高效地进行数据处理。
异或运算的结果不仅取决于操作数的值,还取决于操作数的顺序。
因此,在进行异或运算时,需要注意操作数的顺序。
4. 校验码的应用,生成校验码后,可以将其附加在数据中进行传输。
接收方在接收到数据后,同样进行CRC码的计算,并将计算得到的校验码与接收到的校验码进行比较,以判断数据是否正确传输。
总结起来,CRC循环冗余校验码计算是一种通过生成多项式进行多项式除法运算的方法,用于检测和纠正数据传输中的错误。
在计算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冗余校验码。