如何开始读取二进制数据的偏移量?

时间:2011-06-12 19:44:18

标签: ruby binary-data bindata

我有一个类似C的结构:

SomeStruct << BinData::Record
endian :little

uint32 :offsetOfName
uint32 :offsetOfLastname
#...
uint32 :lenVars
struct :Person, :length => :lenVars
    string :name
    string :lname
    #...
end

我在:Person之前有一堆偏移和长度。所有偏移量和长度都描述了:Person结构中的数据。

如何以指定的偏移量,给定的长度或直到下一个偏移量开始读取数据?

3 个答案:

答案 0 :(得分:4)

寻求偏移1234,然后将32个字节读入字符串s:

open 'some-binary-file', 'r' do |f|
  f.seek 1234
  s = f.read 32
  # tho in your case, something like:
  o = aBinData_object.read f
  p s
end

更新:看起来BinData了解编码自己字段长度的记录,但我怀疑是否有任何方法可以让它寻找你,除非你愿意基本上编码虚拟字段搜索空间的大小,然后永远忽略它正在跳过的数据。

我怀疑一个好的解决方案将涉及一个明确的搜索,然后someBinDataObject.read(f)来获取记录。

答案 1 :(得分:2)

BinData有两个与偏移相关的选项 - :check_offset和:adjust_offset。这些没有记录在手册中,但记录在bindata / offset.rb

以下是他们如何运用你的榜样。

class SomeStruct < BinData::Record
  endian :little

  uint32 :offsetOfName
  uint32 :offsetOfLastname
  #...
  uint32 :lenVars

  struct :person do
    string :name,  :adjust_offset => :offsetOfName,
                   :read_length => lambda { offsetOfLastName - offsetOfName }
    string :lname, :adjust_offset => :offsetOfLastName,
                   :read_length => ...
    #...
  end
end

答案 2 :(得分:1)

BinData的文档:http://bindata.rubyforge.org/#nested_records

不熟悉BinData所以也许我不在这里,但是示例似乎为最外层的结构定义了一个类:

class SomeStruct < BinData::Record
...

然后讨论在该类中嵌套匿名结构:

  struct :person do
  ...

另外,看起来你正在给你的内部结构:人是一个长度。我猜这个长度不适用于此。