0

故事

在进行实验时,我正在保存由硬件 RNG 设备生成的随机字节流。实验完成后,我意识到保存方法不正确。我希望我能找到修复损坏文件的方法,以便获得正确的随机数流。

例子

这个问题的故事可以用下面的简单例子来解释。

假设我在输入文件中有一个随机数流randomInput.bin。我将通过将输入文件发送到标准输出来模拟来自硬件 RNG 设备的随机数流cat。我找到了两种方法如何将此流保存到文件中:

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)创建的更改并获得原始随机字节流。

非常感谢您!

4

1 回答 1

0

问题可能println是针对文本的,并且此文本被编码为 Unicode,它对某些或所有字符使用多个字节,具体取决于 Unicode 的版本。

如果文件比它应该的大 2 倍,那么你可能每隔一个字节就有一个空字节,这很容易修复。否则,可能很难弄清楚恢复二进制数据需要做什么。在十六进制编辑器中查看损坏的文件可能会帮助您了解发生了什么。无论哪种方式,我认为生成新的随机数据并正确保存可能会更容易。

特别是如果这是用于实验,如果您的随机数据已损坏然后修复,那么与最初正确生成数据相比,可能更难证明数据是真正随机的。

于 2019-11-01T16:30:25.753 回答