使用 ruby 以不同大小的块读取二进制文件
Read binary file in chunks of different size with ruby
我正在尝试读取一个包含可变大小块的二进制文件。每个chunk的大小位于每个chunk开头的固定位置。
文件组成如下:
- Main header = 文件的前 20 个字节
- Main header 之后是所有块。
- 每个块有一个 header 16 字节
- chunk header后的4个字节表示chunk的大小
我目前有下面的代码提取主要 header 和块 header,第一个块的大小和数据,但我是新手,
我一直在思考如何对所有块重复这个过程。
有人可以帮我处理一下吗。
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
就环绕:
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
上面的循环将被终止,因为文件中没有更多数据了。请注意,上面的片段通常容易出错,因为它希望文件没有损坏,并且如果最后一个块头报告错误的字节数将会失败。
但你的情况似乎没问题。
我正在尝试读取一个包含可变大小块的二进制文件。每个chunk的大小位于每个chunk开头的固定位置。
文件组成如下:
- Main header = 文件的前 20 个字节
- Main header 之后是所有块。
- 每个块有一个 header 16 字节
- chunk header后的4个字节表示chunk的大小
我目前有下面的代码提取主要 header 和块 header,第一个块的大小和数据,但我是新手, 我一直在思考如何对所有块重复这个过程。
有人可以帮我处理一下吗。
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
就环绕:
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
上面的循环将被终止,因为文件中没有更多数据了。请注意,上面的片段通常容易出错,因为它希望文件没有损坏,并且如果最后一个块头报告错误的字节数将会失败。
但你的情况似乎没问题。