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分组视频流)求和的输入。 / p>
答案 0 :(得分:2)
您实际上无法将CRC转换为对等版本,但这不是您需要做的。您当然可以 使用必须的标准库函数来实现所需的CRC。
这两个更新函数执行相同的操作,但是它们在CRC多项式本身中使用不同的字节顺序。
要使您的MSB表可用于LSB更新功能,只需对每个条目进行字节反转。完成后,将结果按字节反转。
我已经在您的实现中显示了此内容:https://play.golang.org/p/VxuZIrTiens
答案 1 :(得分:1)
该方程式只是如何反转多项式(G)中的位。从反向CRC派生正向CRC的唯一方法是也反向发送消息的位。然后,您可以反转结果CRC的位。您可以使用表查找来反转消息的位,这应该相对较快。因此, 与内置CRC一起执行此操作可能比只编写自己所需的CRC更快。
答案 2 :(得分:0)
我已经实现了通用CRC for Go。而且,我相信您会在reveng目录中找到“ CRC-32 / MPEG-2”。是的,名称略有不同,但是经过重新检查的MPEG-TS规范和您的问题,仍然相信这是您所追求的。因此,您可以简单地将我的实现与reveng目录中的参数一起使用。或者,如果出于任何原因想要拥有自己的实现,仍然可以使用我的代码作为如何准备表以及以后如何使用它的示例。只需记住,在这里LSB被称为“反射的”,而MSB则不是“反射的”(这是Ross Williams引入的命名约定,大多数实现都遵循该命名约定)。