Я пытаюсь закодировать функцию, чтобы сопоставить вывод 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, которую я могу интегрировать в мой код.Кто-нибудь может помочь?