Что не так с моей реализацией CRC-12? - PullRequest
2 голосов
/ 04 ноября 2011

Это то, что я имею до сих пор, но, кажется, оно не соответствует http://zorc.breitbandkatze.de/crc.html все время.

short crcTable[256];
for (int i = 0; i < 256; i++) {
    int crc = (i << 4);
    for (int j = 0; j < 8; j++) {
        crc = (crc << 1) ^ ((crc & 0x800) ? 0x80F : 0);
    }
    crcTable[i] = crc & 0xFFF;
}


NSString *theString = @"blah";

unsigned char *string = (unsigned char *)[theString UTF8String];
int length = [theString length];

unsigned short crc = 0;
for (int i = 0; i < length; i++) {
    crc = crcTable[(crc ^ string[i]) & 255] ^ (crc >> 8);
}

NSLog(@"%X", crc);

Одна из наших реализаций неверна, я предполагаю, что она моя. Но я понятия не имею, что не так, или на самом деле, как решить, что не так. Любая помощь будет высоко ценится.

Alec

Ответы [ 2 ]

2 голосов
/ 04 ноября 2011

1 Заменить

crc = crcTable[(crc ^ string[i]) & 255] ^ (crc >> 8);

от

 crc = crcTable[(crc >> 4) ^ string[i]] ^ (crc << 8);

2 Сделайте зеркальное отображение 8 бит каждого байта сообщения, прежде чем использовать их для вычисления значения crc.

3 Наконец, зеркально отразить 12 битов финала crc.

В качестве альтернативы последнему моду вы также можете просто сделать crc & 0xfff и сказать breitbandkatze «перевернуть байты данных».

0 голосов
/ 08 августа 2013

Вы захотите перепроверить, но, похоже, вы строите свою таблицу с помощью кода с прямым порядком байтов и рассчитываете CRC с помощью кода с прямым порядком байтов.

Попробуйте заменить это:

crc = crcTable[(crc ^ string[i]) & 255] ^ (crc >> 8);

с этим:

crc = crc ^ (string[i] << 4);
crc = (crcTable[(crc >> 4) & 0xFF] ^ (crc << 4)) & 0xFFF;

-Jesse

...