gpt4 book ai didi

CRC-32 和 LFSR 在 C 中逐字节

转载 作者:太空宇宙 更新时间:2023-11-04 02:00:15 25 4
gpt4 key购买 nike

我在 C 中实现了 CRC32 算法,但经过数小时的查看并尝试修复它,它仍然无法正常工作。它可以编译,但校验和与几个在线 CRC 计算器中的校验和不同。我怀疑错误出在“if (0 != (character & j))”这一行,但我不明白,因为它甚至与维基百科上的代码基本相同。

wikipedia

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;
}

示例输入:“你好”

预期结果:0x4E26F361(根据 this page ,它使用相同的生成多项式,如页面底部所示)

实际结果:0xc25a747d

@chux:我尝试删除 if 子句中的“0 !=”,但它并没有改变结果。

CRC32_C 仅代表“用 C 语言实现”。正如生成多项式所示,它是标准以太网。

谢谢你的帮助

最佳答案

CRC可能是msb to lsb或lsb to msb,在线示例中的生成多项式可能不同。 CRC32_F 是 msb 到 lsb,CRC32_R 是 lsb 到 msb(多项式反转)。如果您能找到采用十六进制的在线 CRC 计算器,请尝试使用十六进制 01 来测试 msb 到 lsb,或者使用十六进制 80 来测试 lsb 到 msb。其他变体将 crc 初始化为 0xffffffff 和/或在计算 crc 后反转(不是)crc。查看以太网crc的描述,尝试使用CRC32_R,但将crc的初始化更改为crc = 0xfffffffful; .

unsigned long CRC32_F(unsigned char *message, size_t length){
size_t i, j;
unsigned long crc,gnp;
crc = 0x00000000ul;
gnp = 0x04C11DB7ul;
for (i = 0; i < length; i++){
crc ^= ((unsigned long)*message)<<24;
for (j = 0; j < 8; j++){
if (crc & 0x80000000ul)
crc = (crc << 1) ^ gnp;
else
crc = (crc << 1);
}
message++;
}
return crc;
}

unsigned long CRC32_R(unsigned char *message, size_t length){
size_t i, j;
unsigned long crc,gnp;
crc = 0x00000000ul;
gnp = 0xEDB88320ul;
for (i = 0; i < length; i++){
crc ^= ((unsigned long)*message)<<0;
for (j = 0; j < 8; j++){
if (crc & 0x00000001ul)
crc = (crc >> 1) ^ gnp;
else
crc = (crc >> 1);
}
message++;
}
return crc;
}

关于CRC-32 和 LFSR 在 C 中逐字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28179701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com