找回密码
 立即注册
首页 业界区 安全 CRC32的直接和反转模式

CRC32的直接和反转模式

蒲善思 前天 17:10
CRC计算的本质是对数据流进行一种二进制除法。关键在于:我们是先处理一个字节的最高有效位是(MSB),还是最低有效位(LSB)
直接模式/正向就是处理MSB,一个字节最高位bit7到最低位bit0
反转模式/反向则是LSB,先处理一个字节的最低位bit0,到最高位bit7
两者在计算时,初值,多项式,结果是否反转中多项式为反转的模式
比如正常crc32,直接模式的多项式为0X4C11DB7 , 反转模式是0xEDB88320
1.png

下面是CRC32的两种c语言代码
2.png

点击查看代码
  1. uint32_t CRC32(uint8_t *data, uint16_t len, uint32_t init)
  2. {
  3.         /*init = 0xFFFFFFFF*/
  4.     uint32_t poly = 0x04C11DB7;
  5.     uint8_t i;
  6.     while (len--)
  7.     {
  8.         init = init ^ (*data << 24);
  9.         for (i = 0; i < 8; i++)
  10.         {
  11.             if (init & 0x80000000)
  12.             { // if成立,该二进制位是1
  13.                 init = (init << 1) ^ poly;
  14.             }
  15.             else
  16.             { // esle成立,该二进制位是0
  17.                 init = (init << 1);
  18.             }
  19.         }
  20.         data++;
  21.     }
  22.     return init;
  23. }
  24. /*反crc*/
  25. uint32_t crc32_reverse(const uint8_t *data, size_t length)
  26. {
  27.     uint32_t crc = 0xFFFFFFFF;
  28.     uint32_t polynomial = 0xEDB88320;
  29.     for (size_t i = 0; i < length; i++)
  30.     {
  31.         crc ^= data[i];
  32.         for (int j = 0; j < 8; j++)
  33.         {
  34.             if (crc & 1)
  35.             {
  36.                 crc = (crc >> 1) ^ polynomial;
  37.             }
  38.             else
  39.             {
  40.                 crc = crc >> 1;
  41.             }
  42.         }
  43.     }
  44.     return ~crc;
  45. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册