Wie fange ich an, einen Offset in Binärdaten zu lesen?
-
27-10-2019 - |
Frage
Ich habe eine C-ähnliche Struktur wie diese:
SomeStruct << BinData::Record
endian :little
uint32 :offsetOfName
uint32 :offsetOfLastname
#...
uint32 :lenVars
struct :Person, :length => :lenVars
string :name
string :lname
#...
end
Ich habe vorher ein paar Offsets und Längen :Person
. Alle Offsets und Längen beschreiben die Daten innerhalb der :Person
Struktur.
Wie kann ich Daten in einem bestimmten Offset, für die angegebene Länge oder bis zum nächsten Offset beginnen?
Lösung
Versuchen Sie, 1234 auszugleichen und dann 32 Bytes in die Zeichenfolge zu lesen 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
Aktualisieren: Es sieht so aus, als ob Bindata Datensätze versteht, die die Längen ihrer eigenen Felder kodieren, aber ich bezweifle, ob es eine Möglichkeit gibt, es zu suchen, es sei denn Ignorieren Sie für immer die Daten, die sie überspringen.
Ich vermute, dass eine gute Lösung eine explizite Suche beinhalten und dann someBinDataObject.read(f)
um den Rekord zu bekommen.
Andere Tipps
Bindata hat zwei Optionen im Zusammenhang mit Offsets:: check_offset und: adjep_offset. Diese sind nicht im Handbuch dokumentiert, sondern in Bindata/offset.rb dokumentiert
Hier erfahren Sie, wie sie in Ihr Beispiel zusammenarbeiten würden.
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
Dokumente für Bindata: http://bindata.rubyforge.org/#nested_records
Nicht mit Bindata vertraut, also bin ich vielleicht hier aus der Basis, aber die Beispiele scheinen eine Klasse für die äußerste Struktur zu definieren:
class SomeStruct < BinData::Record
...
Dann geht es darum, anonyme Strukturen innerhalb dieser Klasse zu nisten:
struct :person do
...
Sieht auch so aus, als würden Sie Ihrer inneren Struktur: Person eine Länge geben. Meine Vermutung ist, dass hier nicht zutrifft.