如果您需要位,那么您必须手动进行打包和解包。 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' –