故事
在进行实验时,我保存了由硬件 RNG 设备生成的随机字节流。实验完成后,我发现保存方法不正确。我希望我能找到修复损坏文件的方法,以便获得正确的随机数流。
示例
这个问题的故事可以用下面的简单例子来解释。
假设我的输入文件 randomInput.bin
中有一个随机数流。我将通过 cat
将输入文件发送到 stdout 来模拟来自硬件 RNG 设备的随机数流。我找到了两种将此流保存到文件的方法:
A) 无害保存方法
此方法为我提供了原始的随机字节流。
import scala.sys.process._
import java.io.File
val res = ("cat randomInput.bin" #> new File(outputFile))!
B) 保存方法导致损坏
不幸的是,这是我选择的原始保存方法。
import scala.sys.process._
import java.io.PrintWriter
val randomBits = "cat randomInput.bin".!!
val out = new PrintWriter(outputFile)
out.println(randomBits)
if (out != null) {
out.close()
Seq("chmod", "600", outputFile).!
}
使用方法B)保存的文件仍然是二进制的,但是,它比使用方法A)保存的文件大大约2倍。进一步分析表明,随机比特流的随机性明显较低。
摘要
我怀疑保存方法B) 几乎为每个字节添加了一些内容,但是,对此的理解是我在 Java/Scala I/O 方面的专业知识的背后。
如果有人向我解释方法 A) 和 B) 之间的低级差异,我将非常感激。目标是恢复通过保存方法B)创建的更改并获取原始的随机字节流。
提前非常感谢您!
最佳答案
问题可能是 println
用于文本,而该文本被编码为 Unicode,它对部分或全部字符使用多个字节,具体取决于 Unicode 的版本。
如果文件比应有的大小正好大 2 倍,那么您可能每隔一个字节就有一个空字节,这很容易修复。否则,可能很难弄清楚恢复二进制数据需要做什么。在十六进制编辑器中查看损坏的文件可能会帮助您了解发生了什么。不管怎样,我认为生成新的随机数据并正确保存可能更容易。
特别是如果这是一个实验,如果您的随机数据已被损坏然后修复,那么与一开始就正确生成数据相比,可能更难证明数据是真正随机的。
关于java - 如何在 Java/Scala 中正确地将字节流保存到文件中?如何修复错误保存的流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58662616/