2012-10-22 73 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)? –