繁体   English   中英

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

[英]CRC Calculations in C - Adding single bit function to Ross Williams Library

早上好 !

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

Ross N. Williams提供了一个出色的指南,名为“ CRC错误检测算法的无痛指南”,其中包括我想使用的通用C实现。 (包括源代码的链接)

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

这是添加字节的代码:

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的使用。 一位的反射就是相同的一位。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM