在Ruby中将基数为2的数字字符串数组写入二进制文件

Iva*_*lov 19 ruby io bindata

我在Ruby中编写了一个简单的霍夫曼编码.作为输出,我有一个数组,例如:

["010", "1111", "10", "10", "110", "1110", "001", "110", "000", "10", "011"]
Run Code Online (Sandbox Code Playgroud)

我需要在文件中写入,然后读取它.我尝试了几种方法:

IO.binwrite("out.cake", array)
Run Code Online (Sandbox Code Playgroud)

我得到一个简单的文本文件,而不是二进制.

要么:

File.open("out.cake", 'wb' ) do |output|
  array.each do | byte |
       output.print byte.chr
  end
end
Run Code Online (Sandbox Code Playgroud)

看起来它有效,但后来我无法将其读入阵列.

我应该使用哪种编码?

小智 28

我想你可以使用Array#packString#unpack喜欢以下代码:

# Writing
a = ["010", "1111", "10", "10", "110", "1110", "001", "110", "000", "10", "011"]
File.open("out.cake", 'wb' ) do |output|
  output.write [a.join].pack("B*")
end

# Reading
s = File.binread("out.cake")
bits = s.unpack("B*")[0] # "01011111010110111000111000010011"
Run Code Online (Sandbox Code Playgroud)

我不知道您阅读结果的首选格式,我知道上述方法效率低下.但无论如何,你可以从unpack遍历你的霍夫曼树的结果顺序取"0"或"1" .