早上好!
对于无线应用程序,我需要实现各种CRC计算。根据该规范,CRC计算应作为移位寄存器来实现。See EPC Spec
有一本很好的指南,叫做“CRC错误检测算法的无痛指南”,由RossN.Williams撰写,其中包括一个我想使用的通用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
必须是0
或1
,因此要添加的位是ch
的底部位,则需要将uch
向上移动cm_width-1
,而不是在独占或进入寄存器之前。
也不要使用cm_width-8
。一个位元的反射就是同一个位元。
您还可以查看mycrcany code,它在C中为任何CRC定义生成CRC代码,包括一个例程,如果流的最后1到7位的CRC长度不是8位的倍数,则该例程将计算流的最后1到7位的CRC。
关于c - C语言中的CRC计算-向Ross Williams库添加单一位函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42155941/