我有一个类似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和:adjust_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/#nested_records
不熟悉BinData,所以我可能在这里偏离了基础,但这些例子似乎为最外层的结构定义了一个类:
class SomeStruct < BinData::Record
...
然后讨论了在类中嵌套匿名结构:
struct :person do
...
此外,看起来你在给你的内部结构:person一个长度。我猜这个长度不适用于这里。