gpt4 book ai didi

C 中的 CRC 计算 - 向 Ross Williams 库添加单位函数

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

早上好!

对于无线应用程序,我需要实现各种 CRC 计算。根据规范,CRC 计算应作为移位寄存器实现。 See EPC Spec

Ross N. Williams 有一个名为“CRC 错误检测算法的无痛指南”的优秀指南,其中包括我想使用的通用 C 实现。 (Link including the SourceCode)

问题在于包含的函数仅将完整的字节作为输入。我的消息可以有不同的长度。

这是添加一个字节的代码:

void cm_nxt(p_cm,ch)
p_cm_t p_cm;
int ch;
{
int i;
ulong uch = (ulong)ch;
ulong topbit = BITMASK(p_cm->cm_width - 1);

if (p_cm->cm_refin) uch = reflect(uch, 8);
p_cm->cm_reg ^= (uch << (p_cm->cm_width - 8));
for (i = 0; i <8; i++) {
if (p_cm->cm_reg & topbit)
p_cm->cm_reg = (p_cm->cm_reg << 1) ^ p_cm->cm_poly;
else
p_cm->cm_reg <<= 1;
p_cm->cm_reg &= widmask(p_cm);
}
}

现在我想实现一个函数,只是在计算中添加一位。我尝试了以下代码:

void cm_nxt_bit(p_cm, ch)
p_cm_t p_cm;
int ch;
{
ulong uch = (ulong)ch;
ulong topbit = BITMASK(p_cm->cm_width - 1);

if (p_cm->cm_refin) uch = reflect(uch, 8);
p_cm->cm_reg ^= (uch << (p_cm->cm_width - 8));

if (p_cm->cm_reg & topbit)
p_cm->cm_reg = (p_cm->cm_reg << 1) ^ p_cm->cm_poly;
else
p_cm->cm_reg <<= 1;
p_cm->cm_reg &= widmask(p_cm);
}

不幸的是,它没有按预期工作。你能帮我实现这样的功能吗?

最佳答案

您需要将一位放在寄存器的顶部,就像其他代码将一个字节放在寄存器的顶部一样。假设 ch 必须是 01,这样您要添加的位就是 ch 的底部位>,然后您需要将 uch 向上移动 cm_width-1,而不是 cm_width-8,然后再对寄存器进行异或运算。

也摆脱了 reflect 的使用。一位的反射(reflect)是同一个位。

你也可以看看我的crcany code ,它在 C 中为任何 CRC 定义生成 CRC 代码,包括一个例程,如果它的长度不是八位的倍数,它将计算流的最后 1 到 7 位的 CRC。

关于C 中的 CRC 计算 - 向 Ross Williams 库添加单位函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42155941/

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