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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top