Pregunta

Tengo una estructura similar a C:

SomeStruct << BinData::Record
endian :little

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

Tengo un montón de compensaciones y longitudes antes :Person. Todas las compensaciones y longitudes describen los datos dentro del :Person estructura

¿Cómo puedo comenzar a leer datos en un desplazamiento específico, para la longitud dada o hasta el siguiente desplazamiento?

¿Fue útil?

Solución

Busca compensar 1234 y luego leer 32 bytes en cadena 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

Actualizar: Parece que Bindata entiende los registros que codifican las longitudes de sus propios campos, pero dudo que hay alguna forma de hacer que lo busque, a menos que esté dispuesto a codificar esencialmente campos ficticios del tamaño del espacio buscado, y luego Ignore para siempre los datos que se está omitiendo.

Sospecho que una buena solución implicará una búsqueda explícita y luego someBinDataObject.read(f) Para obtener el registro.

Otros consejos

Bindata tiene dos opciones relacionadas con las compensaciones:: check_offset y: ajuste_offset. Estos no están documentados en el manual, pero se documentan en bindata/offset.rb

Así es como trabajarían en su ejemplo.

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 para bindata: http://bindata.rubyforge.org/#nested_records

No estoy familiarizado con Bindata, así que tal vez estoy fuera de la base aquí, pero los ejemplos parecen definir una clase para la estructura más externa:

class SomeStruct < BinData::Record
...

Luego habla de anidar estructuras anónimas dentro de esa clase:

  struct :person do
  ...

Además, parece que estás dando a tu estructura interior: persona una longitud. Supongo que esa longitud no se aplica aquí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top