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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top