【问题标题】:Calculating CRC using with slice 8 algorithm when number of bits not multiple of 8当位数不是 8 的倍数时,使用 slice 8 算法计算 CRC
【发布时间】:2018-07-11 10:05:06
【问题描述】:

我将使用 slice by 8 算法实现 CRC24C 计算。我已经成功实现了数据位数是 8 的倍数的情况。但是,当输入位数不是 8 的倍数时,8 分片算法失败。我打算将数据位分成两部分,一部分包含 # 个数据位,它是 8 的倍数,另一部分包含剩余位。单独计算CRC24C并将其组合。但是我无法找到一种方法来组合两个单独计算的 CRC。任何建议或想法都会非常有帮助。

【问题讨论】:

  • 我正在用 c++ 实现,所以我虽然它是相关的
  • 如果数据位是 8 的倍数,您可以只添加零位直到数字。如果您希望哈希值在这些地方实际上是零的情况下有所不同,请找到要添加的其他内容。
  • 我已尝试附加零,但它导致的 CRC 值与正确值不同。
  • @V.Kravchenko 非常感谢您的建议,我在整数的 LSB 侧附加零导致不同的 CRC,在整数的 MSB 侧附加零后,我得到了正确的 CRC。

标签: c++ crc crc32 crc16


【解决方案1】:

您可以使用一个简单的函数来计算 CRC 的前几位和/或后几位,具体取决于您的数据在内存中的布局方式。我不知道您使用的是哪种 24 位 CRC,但对于这个:

width=24 poly=0x864cfb init=0xb704ce refin=false refout=false xorout=0x000000 check=0x21cf02 residue=0x000000 name="CRC-24"

此 C 代码将使用 val 低字节中的高 bits 位更新 crc

unsigned crc24_rem(unsigned crc, unsigned val, unsigned bits) {
    val &= 0x100 - (0x100 >> bits) ;
    crc ^= (unsigned)val << 16;
    while (bits--)
        crc = crc & 0x800000 ? (crc << 1) ^ 0x864cfb : crc << 1;
    crc &= 0xffffff;
    return crc;
}

您可以使用crcany 为任何 CRC 定义生成类似这样的代码。


【讨论】:

    猜你喜欢
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    相关资源
    最近更新 更多