Domanda

Ho un C-come struct in questo modo:

SomeStruct << BinData::Record
endian :little

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

Ho un mucchio di offset e lunghezze prima di :Person. Tutti gli spostamenti e le lunghezze descrivono i dati all'interno della struct :Person.

Come posso iniziare la lettura dei dati in un determinato offset, per la data lunghezza, o fino a quando il prossimo spostamento?

È stato utile?

Soluzione

mirino a compensare 1234 e quindi leggere 32 byte in stringa 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

Aggiornamento: Sembra che BinData capisce record che codificano le lunghezze dei loro campi, ma dubito se c'è qualche modo per renderlo cercare per voi, a meno che non si è disposti a essenzialmente codificare manichino campi la dimensione dello spazio cercata-over, e quindi di ignorare per sempre i dati che sta per saltare.

Ho il sospetto che una buona soluzione comporterà un esplicito cercano e poi someBinDataObject.read(f) per vedere la scheda.

Altri suggerimenti

BinData ha due opzioni relative a compensazioni -: check_offset e: adjust_offset. Queste non sono documentate nel manuale, ma sono documentati in BinData / offset.rb

Ecco come avrebbero lavorano nel vostro esempio.

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

Documenti per BinData: http://bindata.rubyforge.org/#nested_records

Non hanno familiarità con BinData così forse io sono fuori base qui, ma gli esempi sembrano definire una classe per la struttura esterna:

class SomeStruct < BinData::Record
...

Poi si parla di struct anonimi nidificazione all'interno di tale classe:

  struct :person do
  ...

Inoltre, sembra che si sta dando il vostro struct interna: persona una lunghezza. La mia ipotesi è che la lunghezza non si applica qui.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top