我正在尝试读取具有可变大小块的二进制文件。每个块的大小位于每个块开头的固定位置。
该文件的组成如下:
我目前有下面的代码提取第一个块的主头和块头,大小和数据,但我很新手, 我陷入了如何为所有块重复这个过程。
请有人帮我处理。
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
答案 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
上面的循环将被终止,因为文件中没有剩余的数据。请注意,上面的剪切通常容易出错,因为它期望文件没有损坏,如果最后一个块头报告错误的字节数,则会失败。
但在你的情况下似乎没问题。