我的CRC-12实施有什么问题?

时间:2011-11-04 05:21:31

标签: objective-c c crc

这是我到目前为止所做的,但似乎并不总是匹配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);

我们的一个实现是不正确的,我假设它是我的。但是我不知道出了什么问题,或者真的如何解决出了什么问题。任何帮助都会非常感激。

艾力

2 个答案:

答案 0 :(得分:2)

1替换

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

通过

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

2在使用它们计算crc值之前,先镜像每个消息字节的8位。

3最后镜像最终crc的12位。

作为最后一个mod的替代方案,你也可以只做一个crc & 0xfff并告诉breitbandkatze'反向数据字节'。

答案 1 :(得分:0)

您需要仔细检查,但看起来您正在使用big-endian代码构建表并使用little-endian代码计算CRC。

尝试替换它:

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

用这个:

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

-Jesse