2012-10-22 72 views
3

我正在开发一个软件实用程序来将一些数据传输到pci-e板。为了避免数据传输错误,我在每个数据包中都添加了一个CRC字段,以便pci-e板可以用CRC值验证接收到的数据。什么是64b in和32b out的CRC?

然后我们发现CRC值未通过验证。

我使用的boost :: crc_32_type来生成CRC值,而硬件的家伙告诉我,在电路板上的CRC实现从http://www.easics.com/webtools/crctool,他们正在使用的数据总线宽度版本CRC32 - ETHERNET/AAL5。

那么,是否有可能使用boost :: crc_32_type来处理他们正在使用的?

任何建议将不胜感激!

[编辑2013年2月20日]

  1. 工作CRC模板应具有如下定义:
    的boost :: crc_optimal < 32,0x04C11DB7,为0xFFFFFFFF,为0x0,假的,假>
  2. 在处理之前每8个字节的顺序应该被反转
  3. std :: for_each被用来代替process_bytes来得到结果,但我仍然不太了解它们之间的区别。

回答

3

您可以使用crc_32_type - 首先您必须确保您的字节与硬件人员的字节顺序相同。 EASICS代码使用的约定是流中的第一个字节进入数据[63:56]。

+0

根据您的建议,我已经在消息中反转了每个8字节单元的字节顺序,但结果与硬件中的结果没有差异。那么,来自EASICS的代码仍然是CRC32,同时针对64位数据输入进行了优化? –

+0

你怎么得到你的多项式值?这可以得到位反转或字节反转也取决于 –

+0

再次感谢您的回复:)我们在EASICS上使用的多项式是(0 1 2 4 5 7 8 10 11 12 16 22 23 26 32),其中一个I在crc_32_type中使用的是默认的0x04C11DB7。如果我理解正确,它们是相同的东西(来自IEEE 802.3)? –