我正在尝试编写一个函数,将设备的 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 校验和值。 (可以在这里验证)。我浏览了多个站点,但没有找到任何可以集成到我的代码中的 CRC32/MPEG2 直接实现。有人可以帮忙吗?
如 crcalc 网页中所述,CRC-32/MPEG-2 使用左移(未反映)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
}