2010-10-07 20 views
3

我想要拆分data到大块假设8154字节:红宝石:斯普利特二进制数据

data = Zlib::Deflate.deflate(some_very_long_string) 

什么是做到这一点的最好方法是什么?

我试图用这样的:

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

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

回答

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" 
........... 
+0

这工作得很好!谢谢! :) – 2010-10-07 17:50:20

+1

这不会很慢吗? – 2016-12-29 19:36:11

0

接受的答案工作,但不需要创建阵列和对大文件非常慢。

这种替代工作正常,并要快得多(1/500一个1M​​B的文件和10KB的块!):

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)