2013-05-29 46 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

我只是舉了一個例子。我沒有時間仔細測試。 –