【问题标题】:Convert CRC32 sum from LSB-first algorithm to sum for MSB-first algorithm将 CRC32 和从 LSB 优先算法转换为 MSB 优先算法的和
【发布时间】:2018-08-22 05:21:52
【问题描述】:

CRC32 和可以表示为最低有效位在前或最高有效位在前。例如,IEEE CRC32 多项式可以表示为0xedb883200x4c11db7,以及对CRC32 算法的相关更改,如下所示(Go 代码)。

LSB优先算法(反向表示):

func crc32Update(crc uint32, tab *table, p []byte) uint32 {
    crc = ^crc
    for _, v := range p {
        crc = tab[byte(crc)^v] ^ (crc >> 8)
    }
    return ^crc
}

MSB 优先算法(正常表示):

func crc32Update(crc uint32, tab *table, p []byte) uint32 {
    crc = ^crc
    for _, v := range p {
        crc = tab[byte(crc>>24)^v] ^ (crc << 8)
    }
    return ^crc
}

(这些在 CRC32 表结构中具有相关的位反转更改,我没有在此处包含,但请参见 LSB and MSB 的这两个游乐场实现,包括对 Go std 库实现的调用)。

正如wikipedia article 中所述,可以将 LSB 算法总和转换为 MSB 总和。但是,我不清楚这将如何实施。据我了解,链接的文章说有一种方法可以根据 $G(x) = x^nG(x^-1)$ 在两个总和之间进行相互转换,但我不明白如何我会继续使用这种关系。

谁能指出我比 WP 文章更好地解释这一点的文档,以便我可以编写代码?

这个问题的原因是 Go 中的标准库提供了快速 LSB 优先实现,但我不得不处理使用 MSB 优先算法(MPEG-TS 数据包视频流)求和的输入。

【问题讨论】:

  • 为了澄清 Matt Timmermans 的回答,wiki 文章包括一个关于倒数多项式的部分。 wiki 文章提到了“codeword”,它是一条消息和一个附加的 CRC,然后继续解释如果除了代码字的前 n 位之外的所有位都被反转,那么用于生成新 CRC 的倒数多项式,CRC 将等于码字前 n 位的倒数。这不是将 LSB CRC 转换为 MSB CRC 的方式。

标签: algorithm go crc crc32


【解决方案1】:

您实际上无法将 CRC 转换为倒数版本,但这不是您需要做的。您当然可以使用您必须实现所需的 CRC 的标准库函数。

两个更新函数做同样的事情,但它们在 CRC 多项式本身中使用不同的字节顺序。

要使您的 MSB 表适用于 LSB 更新功能,只需对每个条目进行字节反转。完成后,对结果进行字节反转。

我已经在你的实现中展示了这一点:https://play.golang.org/p/VxuZIrTiens

【讨论】:

  • 谢谢,马特。表格反转显然是我没有尝试过的事情。
  • 其实这也没什么用,你还在使用标准库没有提供的 MSB 表构造函数。
  • 只需要建表一次,不会影响标准库更新调用的速度。我不明白你为什么要避免自己制作桌子。
  • 我目前拥有的代码制作表格并计算总和。我希望我可以删除这些行并依赖于标准库,并添加少量内容,这似乎是不可能的,所以我将保留我的实现。
【解决方案2】:

该等式只是如何反转多项式 (G) 中的位。从反向 CRC 导出正向 CRC 的唯一方法是也反转 消息 的位。然后您可以反转生成的 CRC 的位。您可以使用表格查找来反转消息的位,这应该相对较快。因此,可能与内置 CRC 一起执行此操作比编写自己的 CRC 来满足您的需要要快。

【讨论】:

  • 谢谢。目前,我基本上只是使用我这里的 MSB 代码。
【解决方案3】:

我已经实现了一个通用的CRC for Go。而且我相信您所追求的是 reveng 目录中的“CRC-32/MPEG-2”。是的,名称略有不同,但经过重新检查的 MPEG-TS 规范和您的问题仍然相信这是您所追求的。因此,您可以简单地将我的实现与 reveng 目录中的参数一起使用。或者,如果您出于某种原因想要拥有自己的实现,您仍然可以使用我的代码作为示例,说明如何准备表格以及以后如何使用它。请记住,LSB 在那里被称为“反射”,而 MSB 不是“反射”(这是 Ross Williams 引入的命名约定,大多数实现都遵循)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多