2017-01-29 31 views
0

Я наткнулся на эту реализацию 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 бит, если это имеет значение.

+0

«EDIT1» код не является непосредственно исполняемым, но когда сделано работоспособным, он дает '0xB2'. Мне пришлось добавить 'typedef unsigned char byte;'. –

+0

@MarkAdler nope, переключил все на 'unsigned char' - тот же результат – kellogs

+0

Вам нужно разместить точный и полный код, который вы запустили. –

ответ

1

Poly is 0x14D обратный, затем смещенный правый 1 бит, чтобы получить 0xB2. Crc - bit reflected, который использует сдвиги вправо вместо левых сдвигов.

101001101  0x14d 
101100101  0x14d bit reversed = 0x165 
10110010  0x14d bit reversed >> 1 = 0xB2 

Если вы посмотрите на crc8_table[0x80], вы увидите 0xB2. Каждая строка имеет длину 12 байтов, а так как индекс 0x80 является десятичным числом 128, посмотрите на 10-ю строку, начиная с 0x1d, и посмотрите на байт 8 (первый байт этой строки - 120), чтобы увидеть 0xB2.

Я тестировал этот код и он печатает 0xB2:

#include <stdio.h> 
typedef unsigned char byte; 
#define POLY    0xB2 

// prototype 
byte crc8_slow(byte crc, byte *data, size_t len); 

int main(){ 
    byte crc; 
    byte data[1] = {0x80}; 
    crc = crc8_slow(0, data, sizeof(data)/sizeof(byte)); 
    printf("0x%.2X", crc); 
    return 0; 
} 

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; 
} 
+0

ошибка, полезная и запутанная :). Можете ли вы проверить мое редактирование? – kellogs

+0

ОК, это портится с моей 8-битной архитектурой. Я посмотрю еще кое-что. Спасибо! – kellogs

2

Таблица представляет собой crc8_slow() для одиночных байтов 0..255 без начальных и конечных эксклюзивных орлов. Этот код уже имеет POLY, определяемый как 0xb2, который является отражением заданного многочлена (0x4d бит отменен).

Для другого определения CRC-8 с нулевым начальным значением регистра и без окончательного исключения - или просто удалите два исключительных кода из кода.

Вы можете посмотреть crcany для генерации кода CRC для любой заданной спецификации.