CRC计算的本质是对数据流进行一种二进制除法。关键在于:我们是先处理一个字节的最高有效位是(MSB),还是最低有效位(LSB)
直接模式/正向就是处理MSB,一个字节最高位bit7到最低位bit0
反转模式/反向则是LSB,先处理一个字节的最低位bit0,到最高位bit7
两者在计算时,初值,多项式,结果是否反转中多项式为反转的模式
比如正常crc32,直接模式的多项式为0X4C11DB7 , 反转模式是0xEDB88320
下面是CRC32的两种c语言代码
点击查看代码- uint32_t CRC32(uint8_t *data, uint16_t len, uint32_t init)
- {
- /*init = 0xFFFFFFFF*/
- uint32_t poly = 0x04C11DB7;
- uint8_t i;
- while (len--)
- {
- init = init ^ (*data << 24);
- for (i = 0; i < 8; i++)
- {
- if (init & 0x80000000)
- { // if成立,该二进制位是1
- init = (init << 1) ^ poly;
- }
- else
- { // esle成立,该二进制位是0
- init = (init << 1);
- }
- }
- data++;
- }
- return init;
- }
- /*反crc*/
- uint32_t crc32_reverse(const uint8_t *data, size_t length)
- {
- uint32_t crc = 0xFFFFFFFF;
- uint32_t polynomial = 0xEDB88320;
- for (size_t i = 0; i < length; i++)
- {
- crc ^= data[i];
- for (int j = 0; j < 8; j++)
- {
- if (crc & 1)
- {
- crc = (crc >> 1) ^ polynomial;
- }
- else
- {
- crc = crc >> 1;
- }
- }
- }
- return ~crc;
- }
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |