2016-04-29 111 views
3

我見過兩種不同的CRC算法。一種稱爲「直接」,另一種稱爲「非直接」或「間接」。兩者的代碼有點不同。如果直接類型以轉換的初始值提供,兩者都能夠計算相同的校驗和。直接和間接CRC之間的區別

我可以成功運行這兩種算法,我知道如何轉換初始值。所以這是沒有問題的。

我無法找到:爲什麼這兩種算法存在?有人能做別人不能做的事嗎?從用戶的角度來看,它們是多餘的嗎?

UPDATE你可以找到一個可測試的在線實現(和兩個aglorithms的C實現)here。然而,這些術語(或其中之一)在更多地方被提及。像here(「直接表算法」),微控制器參考文獻中,在等論壇

+1

請提供您參考的「直接」和「間接」算法的參考。我已經實施了很多CRC,但我還沒有看到過這些術語。 –

+0

請參閱我的更新。我不確定這些術語是否含糊不清,但很多時候作者都提到初始值需要轉換這一事實,因此這似乎與CRC算法的一個共同特徵有關。 – Silicomancer

回答

1

「直接」指的是如何避免處理Ñ零位在端部用於Ñ位CRC。

CRC的數學定義是消息的一個分割,n零位附加到它。在操作之前,您可以通過排除具有CRC的消息來避免額外的操作,而不是之後。這需要通過CRC處理正常版本中的寄存器的初始值,並將其作爲新的初始值。

由於沒有必要,您將永遠看不到執行額外操作的真實世界的CRC算法。

請參閱您鏈接的文檔中的「10.稍微糾纏的表驅動實現」一節以獲取更詳細的解釋。

+0

如果直接真實世界的算法不會像原來那樣轉換初始值,會發生什麼情況?我認爲它會計算一個不同的(不正確的)校驗和,但只要同一個錯誤一致地完成,它就會工作(相同的漢明距離)...我是否正確? – Silicomancer

+1

是的。結果只是一個常數或者一個常數。 –