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

问题描述 投票:2回答:2

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

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

亚历克

objective-c c crc
2个回答
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'反向数据字节'。


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

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.