Как начать читать в смещении бинарных данных?

StackOverflow https://stackoverflow.com/questions/6324213

  •  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
  ...

Кроме того, похоже, что вы даете своей внутренней структуре: человек по длине. Я предполагаю, что длина здесь не применяется.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top