Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 什么';我的CRC-12实现有什么问题?_Objective C_C_Crc - Fatal编程技术网

Objective c 什么';我的CRC-12实现有什么问题?

Objective c 什么';我的CRC-12实现有什么问题?,objective-c,c,crc,Objective C,C,Crc,到目前为止,这就是我所拥有的,但它似乎并不总是匹配 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 & 0

到目前为止,这就是我所拥有的,但它似乎并不总是匹配

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);
short crcTable[256];
对于(int i=0;i<256;i++){
int crc=(i 8);
}
NSLog(@“%X”,crc);
我们的一个实现是不正确的,我假设它是我的。但我不知道到底出了什么问题,也不知道如何着手找出问题所在。任何帮助都将不胜感激

亚历克

1更换

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


crc=crcTable[(crc>>4)^string[i]]^(crc您将要进行双重检查,但您似乎正在使用大端码构建表,并使用小端码计算crc

尝试替换此:

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

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

crc=crc^(string[i]>4)和0xFF]^(crc恐怕不是。它返回的值大于4096,我认为这是crc-12的限制。另一个猜测是:
crc=crcTable[(crc>>4)^string[i])&255]^(crc Nope!:(这也会返回大于4096的值。我有点迷茫。我从互联网上获得了一些实现,这是唯一一个似乎接近正确的实现,因为它获得了一些正确的值,但不是全部。这让我完全困惑。不过感谢你的建议,继续猜测吧!这是一个稍微有点假设,但是当输出大于0x800时,它似乎不正确。它可能不是0x800,但大约是0x800。当输出大于0x800时,我的实现似乎出了问题。在某个地方。我刚刚编辑了我的答案来描述最终的解决方案。(因此,当您调用
[theString length]时,上面的注释可能读起来有些混乱…)
,它为您提供UTF-16字符串的长度,而不是UTF-8字符串的长度。它们通常会不同。您必须使用
strlen
获取UTF-8字符串的长度或其他方法。
crc = crc ^ (string[i] << 4);
crc = (crcTable[(crc >> 4) & 0xFF] ^ (crc << 4)) & 0xFFF;