CRC-32校验 多项式

在IEEE 802.3 帧中采用的是CRC-32校验码,多项式如下:
x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 多项式按正常写法是0x04C11DB7 ,翻转则为 0xEDB88320;

CRC-16校验是一种广泛使用的错误检测机制,常用于通信协议和数据存储系统中。其核心在于使用特定的生成多项式对数据进行编码,以检测传输过程中可能发生的错误。不同的CRC-16标准对应不同的生成多项式,适用于不同场景。 ### CRC-16常用生成多项式 - **CRC-16/IBM(或称CRC-16)**:`x^16 + x^15 + x^2 + 1` 十六进制表示为 `0x8005`,这是最常用的CRC-16标准之一,广泛应用于工业通信协议中 [^1]。 - **CRC-16/XMODEM**:`x^16 + x^12 + x^5 + 1` 十六进制表示为 `0x1021`,该多项式也被称为CRC-16/XMODEM,常见于文件传输协议中 [^1]。 - **CRC-16/CCITT-FALSE**:`x^16 + x^12 + x^5 + 1` 与XMODEM相同,但初始值通常为`0xFFFF`,用于某些电信标准。 - **CRC-16/MODBUS**:`x^16 + x^15 + x^2 + 1` 初始值为 `0xFFFF`,在Modbus协议中使用,尽管多项式CRC-16/IBM相同,但初始值不同导致结果不同 [^1]。 ### 示例代码:CRC-16/XMODEM实现 以下是一个基于CRC-16/XMODEM标准的Java实现示例: ```java private static final int POLYNOMIAL = 0x1021; // CRC-16-XMODEM 标准多项式 private static final int INITIAL = 0x0000; // 初始值 /** * CRC-16-XMODEM校验 * @param bytes 待校验的值 * @return crc校验码 */ public static int calculateCRC16XMODEM(byte[] bytes) { int crc = INITIAL; for (byte b : bytes) { crc ^= (b & 0xFF) << 8; // XOR with byte value for (int i = 0; i < 8; i++) { if ((crc & 0x8000) != 0) { crc = (crc << 1) ^ POLYNOMIAL; } else { crc <<= 1; } } } return crc & 0xFFFF; } ``` 上述代码中,`POLYNOMIAL`设置为`0x1021`,即CRC-16/XMODEM所使用的生成多项式 [^1]。通过逐字节处理并执行模2除法运算,最终得到CRC-16校验值。 ### 多项式选择的影响因素 生成多项式的选择直接影响CRC的检错能力。例如,`0x1021`(CRC-16/XMODEM)适用于检测短帧中的单比特错误和突发错误,而`0x8005`(CRC-16/IBM)则更适合长帧数据的完整性校验 。此外,初始值、是否反转输入输出等配置也会影响最终的CRC结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值