如果你想要位,那么你必须手动进行打包和解包。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
注意:当字符总数不能被 8 整除时,添加七个零来处理大小写。没有这些零,bit_sequence.scan(/.{8}/)
将删除剩余的字符。