C中的CRC计算 - 向Ross Williams Library添加单比特函数

时间:2017-02-10 09:34:13

标签: c arm crc

早上好!

对于无线应用,我需要实现各种CRC-Caluclations。根据规范,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);
    }
}

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

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

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

1 个答案:

答案 0 :(得分:2)

您需要将一位放在寄存器的顶部,就像其他代码将一个字节放在寄存器顶部一样。假设ch必须是01,那么您要添加的位是ch的底部位,那么您需要转移uch在排除注册之前,请cm_width-1,而不是cm_width-8

也摆脱reflect的使用。一位的反映是同一位。

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