Как начать читать в смещении бинарных данных?
-
27-10-2019 - |
Вопрос
У меня есть C-подобная структура, как это:
SomeStruct << BinData::Record
endian :little
uint32 :offsetOfName
uint32 :offsetOfLastname
#...
uint32 :lenVars
struct :Person, :length => :lenVars
string :name
string :lname
#...
end
У меня есть куча смешений и длины до :Person
. Анкет Все смещения и длины описывают данные в :Person
структура
Как я могу начать чтение данных в указанном смещении, для данной длины или до следующего смещения?
Решение
Стремитесь компенсировать 1234, а затем прочитать 32 байта в строку 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
Обновлять: Похоже, что Bindata понимает записи, которые кодируют продолжительность их собственных полей, но я сомневаюсь, что есть ли какой-нибудь способ заставить его искать вас, если только вы не хотите по существу кодировать манекенские поля размером с искоренного пространства, а затем, а затем, а затем, а затем, а затем и затем. Игнорируйте навсегда данные, которые они пропускают.
Я подозреваю, что хорошее решение будет включать в себя явную поиск, а затем someBinDataObject.read(f)
Чтобы получить запись.
Другие советы
Bindata имеет два варианта, связанные с смещениями -: check_offset и: recated_offset. Они не задокументированы в руководстве, но документированы в Bindata/offset.rb
Вот как они работают в вашем примере.
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
Документы для Bindata: http://bindata.rubyforge.org/#nestest_records
Не знаком с Bindata, так что, возможно, я здесь, но примеры, кажется, определяют класс для самой внешней структуры:
class SomeStruct < BinData::Record
...
Тогда он говорит о гнездовании анонимных структур в этом классе:
struct :person do
...
Кроме того, похоже, что вы даете своей внутренней структуре: человек по длине. Я предполагаю, что длина здесь не применяется.