【问题标题】:Read binary file in chunks of different size with ruby用 ruby​​ 读取不同大小的二进制文件
【发布时间】:2015-12-17 15:26:00
【问题描述】:

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

文件是这样组成的:

  • 主标头 = 文件的前 20 个字节
  • 在 Main 标头之后是所有块。
  • 每个块都有一个 16 字节的标头
  • chunk header后面的4个字节代表chunk的大小。

我目前有下面的代码提取主标题和块标题,第一个块的大小和数据,但我很新手, 我被困在如何对所有块重复这个过程。

请有人帮忙处理我的案子。

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

【问题讨论】:

    标签: ruby size chunks


    【解决方案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
    

    上面的循环将被终止,因为文件中没有更多数据了。请注意,上面的片段通常容易出错,因为它希望文件没有损坏,如果最后一个块头报告错误的字节数,它将失败。

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

    【讨论】:

    • 您好 mudasobwa,非常感谢您的帮助和回答。看起来修改很小,但是当有人不知道时像我一样卡住了jeje。它似乎工作正常,如果文件的字节数少于最后一个块大小,则不会发生错误,只打印可用的字节数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多