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 バイトを文字列に読み込みます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)レコードの取得が含まれると思います。

于 2011-06-12T20:17:15.097 に答える
2

BinData には、オフセットに関連する 2 つのオプション (: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
  ...

また、内部の struct :person に長さを与えているようです。ここでは長さは当てはまらないと思います。

于 2011-06-12T20:43:27.217 に答える