如何将crc-32修改为crc-32 / mpeg-2

时间:2019-01-24 05:18:26

标签: c++ checksum crc crc32

我正在尝试对函数进行编码,以将设备的CRC 32输出与我计算出的实际CRC-32和相匹配。以下是我的代码:

#include <iostream> 
#include <string.h> 
#define CRC32_POLYNOMIAL 0xEDB88320
using namespace std;
unsigned int crc32b(unsigned char *message,size_t l)
{
   int i, j;
   unsigned int byte, crc, mask;

   i = 0;
   crc = 0xFFFFFFFF;
   while (i<l) {
      byte = message[i];            // Get next byte.
      crc = crc ^ byte;
      for (j = 7; j >= 0; j--) {    // Do eight times.
         mask = -(crc & 1);
         crc = (crc >> 1) ^ (0xEDB88320 & mask);
      }
      i = i + 1;
   }
   return ~crc;
}
int main()
{
    unsigned char Buff[] = {0x91,0xFF,0xFC,0xEA,0xFF,0xFF,0x70,0xFF,0xFD,0x87,0x00,0xFF,0xF9,0x1B,0xFF,0xF3,0x4E,0x00,0xFB,0x00,0x00,0x02,0x01,0xFB};
    unsigned long CRC =  crc32b((unsigned char *)Buff,24);
    cout << hex << CRC <<endl;
    getchar();
    return 0;
}

这为我提供了以下有效负载的32位CRC输出:

  

91FFFCEAFFFF70FFFD8700FFF91BFFF34E00FB00000201FB

1980AC80。但是,设备给出的校验和为8059143D

在使用在线CRC计算器进行进一步检查时,我发现设备正在发送CRC-32 / MPEG-2校验和值。 (可以验证here)。我浏览了多个站点,但没有找到可直接集成到我的代码中的任何CRC32 / MPEG2直接实现。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:5)

正如crcalc网页中所述,crc32 / mpeg2使用左移CRC(未反映)以及CRC多项式0x104C11DB7和初始CRC值0xFFFFFFFF,并且不进行补码:

unsigned int crc32b(unsigned char *message, size_t l)
{
   size_t i, j;
   unsigned int crc, msb;

   crc = 0xFFFFFFFF;
   for(i = 0; i < l; i++) {
      // xor next byte to upper bits of crc
      crc ^= (((unsigned int)message[i])<<24);
      for (j = 0; j < 8; j++) {    // Do eight times.
            msb = crc>>31;
            crc <<= 1;
            crc ^= (0 - msb) & 0x04C11DB7;
      }
   }
   return crc;         // don't complement crc on output
}