【发布时间】:2015-03-26 14:41:23
【问题描述】:
我在 C 中实现了一个 CRC32 算法,但经过数小时的环顾并尝试修复它,它仍然无法正常工作。它可以编译,但校验和与几个在线 CRC 计算器中的不同。我怀疑错误出现在“if (0 != (character & j))”这一行,但不明白,因为它甚至与维基百科上的代码基本相同。
int CRC32_C(char *message){
int length, i, j;
unsigned long p,g;
char character;
p = 0x00000000;
g = 0x04C11DB7;
length = strlen(message);
for (i = 0; i < length; i++){
character=*message;
//iterieren durch die bits jedes zeichens
for (j= 0x80; j != 0; j >>= 1){
//(p & 0x80000000)? 1 : 0)
if (0 != (character & j))
p = (p << 1) ^ g;
else
p <<=1;
}
message++;
}
return p;
}
//sample main
int main(char ** argv, int argc){
char *msg;
int p;
msg = "HALLO";
p = CRC32_C(msg);
printf("p ist 0x%x \n", p);
return 0;
}
示例输入:“HALLO”
预期结果:0x4E26F361(根据this page,使用相同的生成多项式,如页面底部所示)
实际结果:0xc25a747d
@chux:我尝试删除 if 子句中的“0 !=”,但并没有改变结果。
CRC32_C 仅代表“在 C 中实现”。正如生成多项式所暗示的,它是标准以太网。
感谢您的帮助
【问题讨论】:
-
你在看维基百科的哪个代码?
-
length是一个未初始化的变量 -
@Nayuki Minase
length与length = strlen(message);一起显示 OK -
请发布示例输入、错误输出和预期输出。
-
建议
if (character & j) p ^= g; p <<=1;而不是if (0 != (character & j)) p = (p << 1) ^ g; else p <<=1;