如果您需要位,那麼您必須手動進行打包和解包。 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}/)
將下降剩餘的字符。
你想讓你的文件包含什麼?人物?或者位?還是Ruby數組?或者是其他東西? –
位。因爲我需要更少的文件大小。 –
答案可能涉及使用'pack' –