CRC算法原理

基础是多项式除法,把发送的数据当作一个二进制流,用这个二进制流除以一个生成多项式(叫做GF(2)),把余数接在原来的二进制后面发送出去
基本过程:

发送方:
发送方和接收方采用同一个生成多项式g(x),其中g(x)的首位和末位必须都是1。发送方数据t(x).
1.发送方m位数据转化成二进制后面添加r位0,扩展到m+r位,追加后的多项式叫T(x)
2.用T(x)除以g(x)后的r位余数y(x),这里除法采用的异或操作,这个余数就是CRC校验码
3.把r位余数y(x)追加到t(x)后面得到s(x),s(x)=t(x)y(x)就是要发送的数据,如果接受方收到这个数据并且没有被篡改过那么这个数除以g(x)一定为0

接收方:
1.用接收到的s(x)除以g(x)
2.如果g(x)为0,则表示数据正确

常用的多项式:

标准

生成多项式

16 进制表示

CRC12

x^12 + x^11 + x^3 + x^2 + x + 1

0x80F

CRC16

x^16 + x^15 + x^2 + 1

0x8005

CRC16-CCITT

x^16 + x^12 + x^5 + 1

0x1021

CRC32

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

0x04C11DB7


java中CRC32的使用:
String msg = "hello world";
Checksum checksum = new CRC32();
byte[] bytes = msg.getBytes();
checksum.update(bytes, 0, bytes.length);
long value = checksum.getValue();
System.out.println(value)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CRC算法原理是一种简单的循环冗余校验(Cyclic Redundancy Check)算法,主要用于数据传输过程中的差错检测。 其基本思想是将要发送的数据看作二进制位序列,通过生成多项式进行计算,得到一个余数。将该余数附加到要发送的数据后面,接收方在接收到数据后也进行一系列的计算与检验,如果得到的余数为0,则认定数据无误。 具体的实现步骤是: 1. 定义生成多项式,通常用多项式的系数表示,例如CRC32使用的是0x04C11DB7。生成多项式选择不同,CRC算法的效果也会不同。 2. 将要发送的数据按照二进制形式进行排列,并进行位填充(通常在数据后面加上若干个0)。 3. 选择一个初始的除数,通常为全1或全0。 4. 将数据与初始的除数进行异或运算,得到余数。 5. 将余数附加到原始数据后面,并作为新的输入数据进行下一轮的计算,重复前面的步骤。 6. 最终得到的余数即为CRC校验码,将其附加到要发送的数据后面。 7. 接收方收到数据后按照相同的生成多项式和步骤进行计算,如果最终的余数为0,则认定数据无误。 在C语言中,可以通过使用位运算和循环来实现CRC算法。具体的实现代码如下: ```c #include <stdio.h> unsigned int crc32(unsigned char *data, unsigned int length) { unsigned int crc = 0xFFFFFFFF; unsigned int i, j; for (i = 0; i < length; i++) { crc ^= data[i]; for (j = 0; j < 8; j++) { if (crc & 1) crc = (crc >> 1) ^ 0xEDB88320; else crc >>= 1; } } return crc ^ 0xFFFFFFFF; } int main() { unsigned char data[] = "123456789"; unsigned int length = sizeof(data) - 1; unsigned int crc = crc32(data, length); printf("CRC32: %08X\n", crc); return 0; } ``` 以上代码实现了一个简单的CRC32算法,能够计算出输入数据的CRC校验码。具体的计算过程是将输入数据转化为二进制形式,并进行异或和位移运算,最后输出CRC校验码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值