Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过'发送和接收数据;嘈杂';数据流_Java_Algorithm - Fatal编程技术网

Java 通过'发送和接收数据;嘈杂';数据流

Java 通过'发送和接收数据;嘈杂';数据流,java,algorithm,Java,Algorithm,我的Java程序将其数据保存到一个二进制文件中,并且(非常)偶尔该文件会由于硬件故障而损坏。通常只有几兆字节的文件会受到影响。为了解决这个问题,我可以写两次数据,但这似乎有些过头了——我更愿意将文件大小的增加限制在20%左右 在我看来,这类似于通过“嘈杂”数据流发送信息的问题。是否有Java库或算法可以将冗余信息写入输出流,以便接收器在引入噪声时能够恢复?有噪声通信的问题已经有了一个很好的解决方案:发送数据(与数据一起)的哈希/CRC,这是(重新)由接收者评估,并重新请求是否在途中发生损坏 换句

我的Java程序将其数据保存到一个二进制文件中,并且(非常)偶尔该文件会由于硬件故障而损坏。通常只有几兆字节的文件会受到影响。为了解决这个问题,我可以写两次数据,但这似乎有些过头了——我更愿意将文件大小的增加限制在20%左右


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

有噪声通信的问题已经有了一个很好的解决方案:发送数据(与数据一起)的哈希/CRC,这是(重新)由接收者评估,并重新请求是否在途中发生损坏


换句话说:使用哈希算法检查损坏情况,并在必要时重新传输,而不是冗余发送数据

您需要的是纠错码。请查看以下代码:

此外,维基百科的文章可能会为您提供更多信息:

两种可能是前向纠错,即发送冗余数据;或者是错误检测系统,即检查哈希值并重新请求任何已损坏的数据。如果腐败是意料之中的事情,那么纠错就是要采取的方法


在不了解环境本质的情况下,给出更具体的建议是不可能的,但这应该让你开始了解如何解决这个问题。

听起来有些过时,但很有趣,我刚刚与编写“移动”应用程序的人进行了类似的对话(不是PDA/手机,而是石油和天然气钻井平台式的现场应用程序). 由于环境的原因,他们实际上是通过修改的
XMODEM
CRC传输写入磁盘的。我认为很容易说,但除了:


使用“rw”中的RandomAccessFile写入数据块(512-4096字节),重新读取以进行CRC检查,如果不匹配则重新写入,或者迭代到下一个块。对于操作系统文件缓存,我很好奇这有多有效?

纠错码。如果我正确地回忆起,额外的比特数作为块大小的logn,因此块越大,校正比特越少


您应该选择一种机制,在普通文本之间交错校验位(可能是最方便的额外字符)。这允许在数据流中存在可修复的漏洞,同时仍具有可读性。

CRC和ECC是检测和(对于ECC)从噪声导致的数据损坏中恢复的可靠解决方案。然而,任何方案都只能应对一定程度的噪音。超过该级别,您将发现未被发现和/或无法纠正的错误。第二个问题是,只有在注入噪声之前添加ECCs/CRC,这些方案才会起作用

但我有点怀疑您可能试图解决错误的问题:

  • 如果在通过通信线路传输文件时发生损坏,则应使用内置ECC etc支持的通信硬件

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

  • >P>你也应该考虑可能是你的应用程序破坏了数据;e、 g.由于代码中存在一些同步错误


如果错误在存储器中,就像在硬盘上一样,如果他只有该文件的哈希/CRC,他将丢失该信息。通过使用ECC,有足够的冗余信息,他可以潜在地纠正错误(取决于丢失的程度)。我认为这不是在谈论数据传输,而是数据存储。OP与验证数据传输的方式相似。啊,是的。我误解了这个问题。尽管如此,对数据进行哈希处理对于通信和persistence.Mic都是有效的——这是Mark愿意发送的数据量和错误频率之间的折衷。如果错误很少且是局部性的,则CRC检查可能每个块只需要不超过一个额外字节,而纠错码可能需要更多字节才能发送。如果您的数据是分段的,则可以使用分段CRC来完成此操作。根据dat的大小,您可以为数据设置4-8字节之间的CRC,该数据应具有合理的抗损坏能力。在每个节的末尾写入CRC,并在检索该节时进行验证。如果CRC或数据损坏,该部分将无效。