【问题标题】:CRC error-correction library? [closed]CRC纠错库? [关闭]
【发布时间】:2009-06-15 17:05:18
【问题描述】:

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

【问题讨论】:

  • 您应该详细说明您正在使用的数据。您是流式传输数据还是存储?传输噪音有多大?
  • 我正在尝试检测和纠正通信协议中的错误。
  • 只是检查,但这里的 CRC 是硬性要求,还是更一般的纠错/检测要求?
  • 纠错/检测的一般要求,只要它对低级通信协议有意义。上次我检查每个人都在使用 CRC32。

标签: java c++ crc error-correction


【解决方案1】:

我相信CRCs 只能检测错误,不能纠正错误。这对于最常见的实现当然是正确的。你想要某种error correction 技术,而不是CRC。我不知道有什么库可以做到这一点,但是一旦你知道你在寻找什么,它们一定很容易找到。

【讨论】:

  • 这听起来不对。根据cs.nmsu.edu/~pfeiffer/classes/573/notes/ecc.html 的说法:“任何可以始终检测到两位错误的错误检查代码始终可以纠正任何一位错误”。而dsprelated.com/showmessage/107079/1.php:“为了能够进行单次纠错,ECC 位的字长必须小于或等于 2**N,其中 N 是 ECC 位的数量”
  • 这在一般层面上是正确的,但 CRC 算法不会进行校正。
  • 您当然可以使用 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(对于单个错误纠正,查找表将包含单个错误位的索引)。
【解决方案2】:

您不需要 CRC,而是需要 FEC(前向纠错)。您可以在libfec 中找到开源实现。

【讨论】:

    【解决方案3】:

    关于纠错的最佳技术解决方案称为涡轮码。 有关详细信息,请参阅http://en.wikipedia.org/wiki/Turbo_code

    但恐怕你找不到太多免费的实现。

    如果你真的想要一个免费的,试试http://rscode.sourceforge.net/

    【讨论】:

    • turbo 代码相当复杂,以实现高编码效率。
    【解决方案4】:

    参考以下内容:我认为 CRC 只能检测错误,不能纠正错误。

    作者被误导了。 CRC 可用于纠正单比特错误。 C/C++ 用户日志 - 2003 年 6 月 - 第 6 页。

    http://www.drdobbs.com/an-algorithm-for-error-correcting-cyclic/184401662?queryText=Bill%2BMcDaniel

    【讨论】:

    • 如果有一个在线资源的链接会很高兴。
    【解决方案5】:

    我不认为 CRC 经常用于纠错,但是如果你想检查和修复文件集,你总是可以尝试 par2,它经常在 usenet 上使用。您可以在 Internet 上找到很多文档和实现,例如 win32 library

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-02
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      相关资源
      最近更新 更多