使用ruby以不同大小的块读取二进制文件

时间:2015-12-17 15:26:00

标签: ruby size chunks

我正在尝试读取具有可变大小块的二进制文件。每个块的大小位于每个块开头的固定位置。

该文件的组成如下:

  • 主标题=文件的前20个字节
  • 在Main标题出现之后。
  • 每个块都有一个16字节的标题
  • 块头之后的4个字节表示块的大小。

我目前有下面的代码提取第一个块的主头和块头,大小和数据,但我很新手, 我陷入了如何为所有块重复这个过程。

请有人帮我处理。

FILENAME="file.bin"

open(FILENAME, "rb") do |z|
    mainheader = z.read(20).unpack('H*')  

    puts mainheader

    puts "############### Chunk No. 1 ######################"

    chunkheader = z.read(16)                                 
    chunksize = z.read(4).unpack('H*')[0].hex
    data = z.read(chunksize).unpack('H*')

    puts chunkheader.unpack('H*')
    puts chunksize
    puts data                    
end

1 个答案:

答案 0 :(得分:1)

围观:

puts "############### Chunk No. 1 ######################"

chunkheader = z.read(16)                                 
chunksize = z.read(4).unpack('H*')[0].hex
data = z.read(chunksize).unpack('H*')

puts chunkheader.unpack('H*')
puts chunksize
puts data 

带循环:

while chunkheader = z.read(16) do
  puts "############### Chunk ######################"
  chunksize = z.read(4).unpack('H*')[0].hex
  data = z.read(chunksize).unpack('H*')

  puts chunkheader.unpack('H*')
  puts chunksize
  puts data 
end

上面的循环将被终止,因为文件中没有剩余的数据。请注意,上面的剪切通常容易出错,因为它期望文件没有损坏,如果最后一个块头报告错误的字节数,则会失败。

但在你的情况下似乎没问题。