6

我有一个像这样的类 C 结构:

SomeStruct << BinData::Record
endian :little

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

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

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

4

3 回答 3

4

求偏移 1234,然后将 32 个字节读入 Strings:

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)获取记录。

于 2011-06-12T20:17:15.097 回答
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
于 2011-06-14T13:26:45.460 回答
1

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

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

class SomeStruct < BinData::Record
...

然后它谈到在该类中嵌套匿名结构:

  struct :person do
  ...

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

于 2011-06-12T20:43:27.217 回答