Я наткнулся на эту реализацию 8 бит CRC: https://stackoverflow.com/a/15171925/243827CRC8 алгоритм уточнения
Может кто-то пролил некоторый свет на то, как была получена эта таблица? Я раскомментировал функцию crc8_slow
и пытался кормить его с
byte crc;
byte data[1] = {0x01};
crc = crc8_slow(0, data, sizeof(data)/sizeof(byte));
printf("0x%.2X", crc);
для POLY
, определенной для 4d, d4, a6 или b2. Я не могу воспроизвести значение из этой таблицы. Кроме того, как мне нужно изменить этот код для начального значения без 0xff регистра сдвига?
EDIT1:
#define POLY 0xB2
byte crc;
byte data[1] = {0x80};
crc = crc8_slow(0, data, sizeof(data)/sizeof(byte));
printf("0x%.2X", crc);
byte crc8_slow(byte crc, byte *data, size_t len)
{
byte *end;
if (len == 0)
return crc;
// crc ^= 0xff;
end = data + len;
do {
crc ^= *data++;
crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1)^POLY : crc >> 1;
} while (data < end);
// return crc^0xff;
return crc;
}
Урожайность 0x01
, когда бежал. Я нахожусь на Atmega 8 бит, если это имеет значение.
«EDIT1» код не является непосредственно исполняемым, но когда сделано работоспособным, он дает '0xB2'. Мне пришлось добавить 'typedef unsigned char byte;'. –
@MarkAdler nope, переключил все на 'unsigned char' - тот же результат – kellogs
Вам нужно разместить точный и полный код, который вы запустили. –