¿Cómo empiezo a leer en un desplazamiento en datos binarios?
-
27-10-2019 - |
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?
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í.