这是我到目前为止所做的,但似乎并不总是匹配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);
我们的一个实现是不正确的,我假设它是我的。但是我不知道出了什么问题,或者真的如何解决出了什么问题。任何帮助都会非常感激。
艾力
答案 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