CRC错误校正库?

5

是否有一种CRC库可以让用户不仅检测错误,而且还可以纠正它们?我正在寻找一个C/C++或Java库,最好是开源的。


你应该更详细地说明你正在处理的数据。你是在流式传输数据还是存储数据?传输有多嘈杂? - heyitsme
我正在尝试检测和纠正通信协议中的错误。 - Gili
只是确认一下,CRC在这里是硬性要求还是更一般的错误校正/检测要求? - skaffman
只要对低层通信协议有意义,纠错/检测的一般要求是使用CRC32。上次我检查时每个人都在用它。 - Gili
5个回答

6
我认为CRCs只能检测错误,而不能纠正错误。这在最常见的实现中确实是正确的。你需要一些错误纠正技术,而不是CRC。我不知道有没有用于此的库,但一旦你知道自己在寻找什么,它们肯定很容易找到。

4
根据http://www.cs.nmsu.edu/~pfeiffer/classes/573/notes/ecc.html的说法:“能够始终检测到两位错误的任何错误检查代码都可以纠正任何一位错误。”而根据http://www.dsprelated.com/showmessage/107079/1.php的说法:“为了能够进行单错误纠正,带有ECC位的字大小必须小于或等于2 ** N,其中N是ECC位数。”但这听起来不太对。 - Gili
3
一般而言,这是正确的,但CRC算法并不进行纠错。 - skaffman
3
你肯定可以使用 CRC 进行错误校验。利用 CRC(A XOR B) = CRC(A) XOR CRC(B) 这一事实... 将 B 设为错误位,A 设为传输的信息,A XOR B 为接收到的信息。然后 CRC(B) = CRC(A XOR B) XOR CRC(A)。虽然海明距离证明并不适用于所有错误检测码(例如安全哈希码),但是 CRC 没有这样的困难。 然后你需要一个查找表,从 CRC(B) 返回到 B(对于单个错误校正,查找表将包含单个错误位的索引)。 - Ben Voigt

6
你需要的不是CRC(循环冗余校验),而是FEC(前向纠错)。你可以在libfec中找到一个开源实现。libfec

3

Turbo码为了实现高编码效率而相当复杂。 - Jason S

1

2
最好能提供一个在线资源的链接。 - Gili

0

我认为CRC在纠错方面并不经常使用,但是如果您想检查和修复文件集,您可以尝试使用par2,这在usenet上经常使用。您可以在互联网上找到很多文档和实现,例如win32 library


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接