Ruby:拆分二进制数据

我想将data拆分为8154字节的块:

 data = Zlib::Deflate.deflate(some_very_long_string) 

最好的方法是什么?

我试着用这个:

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

……但数据丢失了! datasize为11682,但是当循环遍历每个块并总结size ,最终总大小为11677.丢失了5个字节! 为什么?

Regexps不是解析二进制数据的好方法。 使用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" ........... 

接受的答案有效,但会创建不需要的数组,对于大文件来说速度极慢。

这个替代方案运行良好,速度更快(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)