バイナリデータのオフセットで読み始めるにはどうすればよいですか?
-
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
...
また、あなたはあなたの内側の構造体を与えているように見えます:人の長さ。私の推測では、ここで長さが当てはまらないと思います。
所属していません StackOverflow