バイナリデータのオフセットで読み始めるにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/6324213

  •  27-10-2019
  •  | 
  •  

質問

私はこのようなcのような構造体を持っています:

SomeStruct << BinData::Record
endian :little

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

私は以前にたくさんのオフセットと長さを持っています :Person. 。すべてのオフセットと長さは、 :Person struct。

指定されたオフセット、指定された長さ、または次のオフセットまでデータの読み取りを開始するにはどうすればよいですか?

役に立ちましたか?

解決

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) レコードを取得するために。

他のヒント

Bindataには、オフセットに関連する2つのオプションがあります。これらはマニュアルに記載されていませんが、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

Bindataのドキュメント: http://bindata.rubyforge.org/#nested_records

Bindataに精通していないので、私はここでベースから外れているかもしれませんが、例は最も外側の構造のクラスを定義しているようです。

class SomeStruct < BinData::Record
...

次に、そのクラス内の匿名の構造体をネストすることについて話します。

  struct :person do
  ...

また、あなたはあなたの内側の構造体を与えているように見えます:人の長さ。私の推測では、ここで長さが当てはまらないと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top