Come faccio a iniziare la lettura a un offset di dati binari?
-
27-10-2019 - |
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?
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.