gpt4 book ai didi

CRC算法实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:55:33 27 4
gpt4 key购买 nike

我正在用 C 实现 CRC16 算法,它是:

初始化 = 0x0000
只要数据流继续
如果数据的第一位不等于初始值的第一位
init = 左移 init 一次并将其与多项式异或
否则
左移初始化
转到下一个数据位
init = CRC 校验和

现在的问题是...如果我在第一次比较后更改初始值,它将始终等于数据流。

例如:如果我得到初始值是

1011 0000 1011 0101

和数据流

0011 0110 1000 0101

第一次迭代后。

它们将始终相等,因为开头的 0 无关紧要,可以忽略。

在下一次迭代之后,它们将是:

011 0000 1011 0101

和数据流分别

011 0110 1000 0101

但同样可以忽略 0,我们得到相等。

我真的很困惑。

这是我的 C 代码:

#define POLY 0x8005

int crc = 0x0000; // Initial value
char data[1024];
int *dp = data;
int fd, nread;

fd = open(argv[1], O_RDWR);
nread = read(fd, data, sizeof(data));
int *end = dp + nread;



while(data < end)
{
crc = crc & 1 && data & 1 ? crc << 1 : (crc << 1) ^ POLY;
data++;
}

最佳答案

几个问题:

  1. 您正在处理最低有效位,但应该处理最高有效位。这可能是导致您对位保持不变感到困惑的原因,因为您正在查看值的错误端。

  2. crc & 1 && data & 1 检查位是否等于 1,而不是检查它们是否彼此相等。

  3. 您似乎对 data 是数组(如声明的那样)、整数(如在 data & 1 中使用的那样)还是指针感到困惑(在 data++ 中使用)。

  4. 如果您将 data 更改为指针并在每一步将其递增 1,这意味着您仅处理每个输入字节的一位。您需要一个内部循环来处理所有 8 位。

关于CRC算法实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38192576/

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