Ruby:拆分二进制数据

3

我想把data分成大小为8154字节的块:

data = Zlib::Deflate.deflate(some_very_long_string)

最佳的做法是什么?

我尝试使用以下方法:

chunks = data.scan /.{1,8154}/

......但是数据丢失了!datasize为11682,但是当循环遍历每个块并累加size时,得到的总大小只有11677。丢失了5个字节!为什么?

2个回答

5

正则表达式不是解析二进制数据的好方法。使用byteseach_slice操作字节。并使用pack 'C*'将它们转换回字符串以进行输出或调试:

irb> data = File.open("sample.gif", "rb", &:read)
=> "GIF89a\r\x00\r........."

irb> data.bytes.each_slice(10){ |slice| p slice, slice.pack("C*") }
[71, 73, 70, 56, 57, 97, 13, 0, 13, 0]
"GIF89a\r\x00\r\x00"
[247, 0, 0, 0, 0, 0, 0, 0, 51, 0]
"\xF7\x00\x00\x00\x00\x00\x00\x003\x00"
...........

1
这不会非常慢吗? - B Seven

1
已接受的答案可行,但创建了不必要的数组,对于大文件来说速度极慢。
这个替代方案很好用,速度快得多(1MB文件和10kB块的速度提高了500倍!):
def get_binary_chunks(string, size)
  Array.new(((string.length + size - 1) / size)) { |i| string.byteslice(i * size, size) }
end

对于给定的示例,您可以按照以下方式使用它:
chunks = get_binary_chunks(data, 8154)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接