2009-12-14 72 views
3

我的Java程序将其数据保存为二进制文件,并且(非常)偶尔会由于硬件故障而使文件损坏。通常只有几个字节在数兆字节的文件中受到影响。为了解决这个问题,我可以写两次数据,但这看起来有点过分 - 我宁愿将文件大小增加限制在20%左右。通过“嘈杂”数据流发送和接收数据

在我看来,这似乎与通过“嘈杂”数据流发送信息的问题类似。是否有Java库或算法可以将冗余信息写入输出流,以便接收器在引入噪声时可以恢复?

回答

8

你想要的是纠错码。检查这个代码了:http://freshmeat.net/projects/javafec/

同时,维基百科的文章可能会给你更多的信息: http://en.wikipedia.org/wiki/Forward_error_correction

您的两个possiblities是前向纠错,在那里你发送冗余数据,或用于错误检测,其中系统您检查散列值并重新请求任何已损坏的数据。如果腐败是一个预期的事情,那么纠错就是需要采取的方法。

不知道你的环境的性质,给予更具体的建议是不是真的有可能,但这应该让你开始知道如何解决这个问题。

+0

如果您的数据分段进入,您可以使用部门CRC来完成此操作。根据数据的大小,你可以在4-8个字节之间有一个CRC,用于应该合理抵抗腐败的数据。在每节的末尾写入CRC并在检索节时进行验证。如果CRC或数据损坏,该部分将失效。 – GrayWizardx 2009-12-14 00:32:32

1

嘈杂通信的问题已经有一个很好的解决方案:发送数据的哈希/ CRC(与数据),这是(重新)由接收机评估和重新请求,如果有腐败途中。

换句话说:使用散列算法检查损坏并在必要时重新发送,而不是冗余发送数据。

+0

如果错误在存储器中,如在硬盘上,如果他只有文件的散列/ CRC,他将丢失该信息。通过使用ECC和足够的冗余信息,他可以潜在地纠正错误(取决于丢失的程度)。 – Mic 2009-12-14 00:27:47

+0

我不认为这是在谈论数据传输,而是数据存储。 OP正在绘制如何验证数据传输的方法。 – GrayWizardx 2009-12-14 00:30:33

+0

啊是的。我误解了这个问题。尽管如此,哈希数据将用于通信以及持久性。 – 2009-12-14 00:35:54

0

听起来很过时,但有趣的,我只是的人谁写的“移动”应用程序(不是PDA /手机,但石油天然气&钻机式的现场应用)类似的谈话。由于他们通过修改的XMODEM CRC传输实际写入磁盘的环境。我认为很容易说除了以外没有什么特别的:

在“rw”中使用RandomAccessFile写入数据块(512-4096字节),重新读取CRC校验,如果不重新读取 - 匹配或迭代到下一个块。随着OS文件缓存,我很好奇这是多么有效?

2

纠错码。如果我正确地记得附加位的数量为块大小的log n,则越大的块越少修正位。

你应该选择在普通文本之间交错checkbits(可能是最作为额外的字符方便)的机制。这允许在数据流中有可修复的空洞,同时仍然可读。

1

CRC和ECC是检测和(针对ECC)从噪声中恢复数据损坏的立场答案。但是,任何方案只能应付一定程度的噪音。超过这个水平,你会得到未被发现和/或不可纠正的错误。第二个问题是,只有在注入噪声之前添加ECC/CRC,这些方案才会起作用。

但我有点怀疑,你可能会试图解决错误的问题:如果当你在一个通讯科线传输文件中的腐败发生

  • ,那么你就应该使用通讯科硬件内置ECC等支持。

  • 如果在将文件写入光盘时发生损坏,则应更换光盘。

  • 您还应该考虑它是您的应用程序正在破坏数据的可能性;例如由于代码中的一些同步错误。