【问题标题】:How to read fixed size of bytes turn by turn in continuation using Ruby?如何使用 Ruby 依次连续读取固定大小的字节?
【发布时间】:2012-04-14 20:24:06
【问题描述】:

我有一个二进制文件,我想读取这个文件,比如前四个字节,然后是接下来的 5 个字节,然后是接下来的 3 个字节,直到文件结束。

我可以使用 each_byte 读取文件,但我想将所有这些字节按存储在文件中的顺序分组。

我可以使用以下几行阅读此内容,但不知道如何阅读具有连续性的固定大小的块。

File.open('myfile','rb') do |file|
file.each_byte {|ch| print "#{ch.chr}:#{ch}\t"}

结束

【问题讨论】:

    标签: ruby size byte fixed continuations


    【解决方案1】:

    我不确定我是否理解,但可能是这样的:

    file.read.scan(/(.{4})(.{5})(.{3})/).each do |a,b,c|
        puts "first 4 bytes: #{a}"
        puts "bytes 5 to 10: #{b}"
        puts "3 more bytes: #{c}"
    end
    

    【讨论】:

    • 它接近我想要做的,但我想像脚本打印行“前 4 个字节”然后打印前 4 个字节的内容,然后打印“字节 5 到 10”,然后在它下面的字节内容5 到 10 以此类推,直到文件结束。
    • 好的,但是如果在一些固定大小的块之后我想打印其余的可变长度块怎么办,我怎样才能一次打印它们?我的意思是我需要在 regexp 而不是 /(.{4})/ 中使用什么?
    • 也想以十六进制或其他编码方式打印。
    【解决方案2】:

    它不是真的很快,但它是红宝石:-)

    file.each_byte.slice_before({pattern: [4,5,3].cycle, left: 0}) do |ele, state|
      if state[:left] == 0
        state[:left] = state[:pattern].next
        true
      else
        state[:left] -= 1
        false
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2018-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 2013-12-24
      相关资源
      最近更新 更多