我知道使用CRC的全部目的是做錯誤檢測,但是我聽到有人說它除了錯誤檢測之外還可以用來做基本的錯誤糾正。我很好奇,如果是這樣,如果是這樣,它有多強大?我的意思是,我們通常將CRC稱爲能夠執行x位檢測,但我很好奇它是否能夠執行x位校正。如果是這樣,這是如何工作的?謝謝。是否可以用CRC做基本的糾錯?
回答
有可能用CRC進行單比特糾錯。假設一個具有CRC「登記」,並具有以下功能:以運行CRC算法向前和向後一點的時間,忽略傳入的數據
int crc_forward(int old_value, int data_bit) { if (old_value & 0x8000) return ((old_value^0x8000) SHL 1)^0x1021^data_bit; else return (old_value SHL 1)^data_bit; } int crc_reverse(int old_value) { if (old_value & 1) return (old_value SHR 1)^0x8810; else return old_value SHR 1; }
假設一個具有被計算,使得初始化CRC一些分組值併爲每個位(MSB優先)運行crc_forward應爲零。如果得到的CRC值不是零,則可以反向運行算法(忽略數據位),直到計算出的CRC值爲1.這就是不正確位的位置。
請注意,這種方法可能適用於NAND閃存等軟件糾錯。爲了有用地將其用於硬件糾錯,必須能夠延遲讀取操作直到ECC可以被處理,否則將需要「綜合症」值和位位置的表。
我最近致力於CRC16錯誤檢測和單比特糾錯。
這裏的基本思想是:
- 假設你有一個單比特錯誤。
- 如果data + crc不包含錯誤,則CRC將爲0,否則不會。
- 我們定義CRC作爲CRCr發送的CRC和CRC。
- 然後錯誤位由
CRCox = CRCs^CRCr
給出。 - 結果包含CRC錯誤和數據錯誤。
- 看看CRCox和誤碼之間有什麼關係。
這是否清楚?我有一篇關於這個的文章。如果你想知道更多,請讓我知道。
您可以使用CRC執行多位錯誤更正。看看維基百科,參考koopmans的工作,CRC可以檢測到它的hamming_distance-1錯誤。漢明距離取決於有效載荷長度和正在使用的CRC多項式。因此,例如Koopmans多項式0xBA0DC66B可以檢測長達16360比特長度的消息中的高達5比特的錯誤。前兩個消息中描述的算法可以根據需要擴展到儘可能多的位,但時間隨着要修復的位數呈指數增長。
- 計算錯誤CRC = CRC_gotten^CRC_expected。
- 查看所有可能的1位消息(即全0,1和全0)(有message_length個案來評估。注意這是BITS而不是BYTES),錯誤位是生成錯誤CRC的消息。
- 反轉檢測到的位以糾正錯誤。
如果找不到與CRC錯誤相匹配的1位,請查看所有2位,3位到hamming_distance-1。請注意,這變得很慢,message_length平方爲2位,立方體爲3位,五位爲5位。
所表示的算法的措辭似乎是單位錯誤的n平方,兩位錯誤的n立方等等,因爲它獨立計算每條消息的CRC需要花費時間N.建議如何在沒有N的額外因子的情況下完成它可能會有所幫助。 – supercat 2015-10-21 15:06:36
否,N表示單個位。我可以計算在logN時間內以N位設置的單個位的CRC。更好的是,考慮到N位消息中位置X處的單個位的CRC,我可以在N + 1處稍微告訴你消息的CRC。這只是CRC內部循環的一個步驟。 – ilgitano 2017-10-07 14:56:08
只是你的crc_forward函數在循環中:從1開始,crc_forward是crc錯誤嗎?不,crc_froward並再次檢查。 – ilgitano 2017-10-08 12:32:17
- 1. 是否可以做Double mod_rewrite?
- 2. 谷歌可以做基本的JavaScript?
- 3. CRC是否具有以下功能
- 4. 是否可以用mongoimport做增量?
- 5. .Net中是否有任何庫可以做一些基本的音頻編輯?
- 6. 是否可以對powershell腳本中的vbscript msgbox做出反應?
- 7. 是否可以做'||' (Javascript)在迅速?
- 8. 是否可以做動態查詢
- 9. 是否有免費的CRC庫,涵蓋了很多CRC算法?
- 10. Meteor.js:是否可以更改URL中的基本路徑?
- 11. 是否可以在基於版本的PHP中進行切換?
- 12. 是否可以使用Firebase版本9.2.1?
- 13. 是否可以使用腳本在Xcode中引發錯誤?
- 14. PHP activerecord基本CRUD操作是否可以防止SQL注入?
- 15. 是否可以在R(基本圖形)中旋轉繪圖?
- 16. GWT:是否可以將基本URL設置爲參數?
- 17. Rails的:方法可以做到基本的電子郵件verifcation
- 18. 如何做基本的可見與knockoutjs
- 19. 可以在JSON文件上做一個基本的CRUD?
- 20. 是否可以居中DateTimePicker的文本?
- 21. 是否可以通過使用WsHttpBinding的基本身份驗證代理?
- 22. 是否可以使用簡單/基本身份驗證使用Facebook API?
- 23. 基本MVC:「modelItem =>」是做什麼的?
- 24. 是否可以調試基於NativeActivity的應用程序?
- 25. 是否可以在C#中調用基於combobox.selecteditem.tostring()的方法?
- 26. 是否可以使用AutoMapper來填充基類的屬性?
- 27. 是否可以設置XCode爲我做引用計數?
- 28. 是否可以使用FtpWebRequest做「活動」模式FTP?
- 29. 是否可以使用Ajax做文件上傳?
- 30. 是否可以使用JavascriptMVC實現撤銷/重做引擎?
我認爲這**可能是@Wandy所指的文件:http://espace.library.uq.edu.au/eserv.php?pid=UQ:9523&dsID=n01393289.pdf – 2012-03-17 15:49:31
For point 2,它不是CRC,它將是0.它接收到的CRC異或CRC根據接收到的數據進行計算! – 2014-01-29 14:16:57
@Étienne當然他的意思是接收數據的CRC + crc爲零 – 2015-11-13 22:05:54