2013-05-29 47 views
19

我已经在Ruby中编写了一个简单的Huffman编码。作为输出,我有一个数组,例如:如何读取/写入二进制文件?

["010", "1111", "10", "10", "110", "1110", "001", "110", "000", "10", "011"] 

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

IO.binwrite("out.cake", array) 

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

或者:

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

它看起来像它的工作原理,但我不能读入数组。

我应该使用哪种编码?

+0

你想让你的文件包含什么?人物?或者位?还是Ruby数组?或者是其他东西? –

+0

位。因为我需要更少的文件大小。 –

+0

答案可能涉及使用'pack' –

回答

27

我想你可以只使用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" 

我不知道阅读的结果,您的首选格式,我知道上面的方法是低效的。但无论如何,你可以从unpack的结果中依次取“0”或“1”来遍历你的霍夫曼树。

+0

@IvanKozlov在这里你可以看到如何将位读回字符串。现在,您只需要使用霍夫曼解码将它分成几块。 –

3

如果您需要位,那么您必须手动进行打包和解包。 Ruby和任何其他常用语言都不会为你做。

您的数组包含字符串组,但您需要构建一个字节数组并将这些字节写入文件。

从这:["010", "1111", "10", "10", "110", "1110", "001", "110", "000", "10", "011"]

你应该建立这些字节:01011111 01011011 10001110 00010011

因为它只是四个字节,你可以把它们放入一个单一的32位数字01011111010110111000111000010011这是5F5B8E13十六进制。

你的代码的两个样本做不同的事情。第一个在文件中写入一个Ruby数组的字符串表示。第二个写32个字节,其中每个是48('0')或49('1')。

如果你想要位,那么你的输出文件大小应该只是四个字节。

阅读位操作以了解如何实现该操作。


这是一个草稿。 我没有测试它。有些东西可能是错的。

a = ["010", "1111", "10", "10", "110", "1110", "001", "110", "000", "10", "011"] 

# Join all the characters together. Add 7 zeros to the end. 
bit_sequence = a.join + "0" * 7 # "010111110101101110001110000100110000000" 

# Split into 8-digit chunks. 
chunks = bit_sequence.scan(/.{8}/) # ["01011111", "01011011", "10001110", "00010011"] 

# Convert every chunk into character with the corresponding code. 
bytes = chunks.map { |chunk| chunk.to_i(2).chr } # ["_", "[", "\x8E", "\x13"] 

File.open("my_huffman.bin", 'wb') do |output| 
    bytes.each { |b| output.write b } 
end 

注:7个零被添加到处理情况下,当字符的总数目不能被8除尽的没有这些零,bit_sequence.scan(/.{8}/)将下降剩余的字符。

+0

你能否粘贴一些示例代码?对于may数组,如何打包并解压缩它? –

+0

基本上霍夫曼码用于压缩或归档。因此,我希望以最小尺寸制作文件。你的想法呢?你建议哪种方法? –

+0

我只是举了一个例子。我没有时间仔细测试。 –