【发布时间】:2018-08-22 05:21:52
【问题描述】:
CRC32 和可以表示为最低有效位在前或最高有效位在前。例如,IEEE CRC32 多项式可以表示为0xedb88320 或0x4c11db7,以及对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 的方式。