Comment puis-je commencer la lecture à un décalage dans les données binaires?
-
27-10-2019 - |
Question
J'ai un C comme struct comme ceci:
SomeStruct << BinData::Record
endian :little
uint32 :offsetOfName
uint32 :offsetOfLastname
#...
uint32 :lenVars
struct :Person, :length => :lenVars
string :name
string :lname
#...
end
J'ai un tas de décalages et longueurs avant :Person
. Tous les décalages et les longueurs décrivent les données dans le struct :Person
.
Comment puis-je commencer la lecture des données à un décalage spécifié, pour la durée donnée, ou jusqu'à ce que le décalage suivant?
La solution
Chercher à décalage 1234 et ensuite lu 32 octets dans une chaîne 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
Mise à jour: Il ressemble à BinData comprend des documents qui codent pour les longueurs de leurs propres champs, mais je doute qu'il y ait un moyen de le faire chercher pour vous, à moins que vous êtes prêt à essentiellement factice encode les champs de la taille de l'espace seeked-dessus, puis ignorer pour toujours les données qu'il est sauter.
Je pense qu'une bonne solution impliquera une explicite et cherchent someBinDataObject.read(f)
puis pour obtenir le dossier.
Autres conseils
BinData a deux options relatives aux décalages -: check_offset et: adjust_offset. Ceux-ci ne sont pas documentées dans le manuel, mais sont documentées dans BinData / offset.rb
Voici comment ils travailleraient dans votre exemple.
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
Docs pour BinData: http://bindata.rubyforge.org/#nested_records
Vous ne connaissez peut-être BinData si je suis ici, mais hors de la base des exemples semblent définir une classe pour la structure extérieure:
class SomeStruct < BinData::Record
...
Ensuite, il parle de structs anonymes de nidification de cette classe:
struct :person do
...
En outre, on dirait que vous donnez à votre struct intérieure: personne une longueur. Je pense que la longueur ne concerne pas ici.