2011-06-12 52 views
5

我有一个C状结构是这样的:如何开始读取二进制数据的偏移量?

SomeStruct << BinData::Record 
endian :little 

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

我有一堆的偏移和长度的:Person之前。所有的偏移和长度都描述了:Person结构中的数据。

如何开始读取指定偏移量,给定长度或直到下一个偏移量的数据?

回答

3

寻求以抵消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)获得记录。

+0

我一直希望用BinData解决方案,但无论如何感谢。我会出去玩一下代码,会让你知道结果。 – omninonsense 2011-06-12 20:23:06

+0

我已经添加了一个小的更新。 – DigitalRoss 2011-06-13 01:21:59

+0

@DigitalRoss你为什么把它读成字符串呢? 打开'some-binary-file','r'do | f | f.seek 1234 o = aBinData_object.read f end 这不够吗? – thegreendroid 2012-02-26 20:38:32

1

Google文档BinData:http://bindata.rubyforge.org/#nested_records

不熟悉BinData所以我可能关闭基地在这里,但例子似乎定义一个类的最外层结构:

class SomeStruct < BinData::Record 
... 

然后谈到嵌套匿名结构:

struct :person do 
    ... 

此外,看起来像你给你的内部结构:人的长度。我的猜测是这个长度在这里不适用。

+0

哦,长度必须保持不变,但它不是那么重要,真的。我甚至可以把它拿出来。我几次阅读文档,寻找我需要的东西,但找不到它,所以这就是为什么我要在这里打扰更聪明的人。 :P – omninonsense 2011-06-12 20:45:43

+0

我的理解是,结构的长度(在c中)是它内部的基本类型长度的总和。我创建了一个BinData :: Struct并试图获取长度:出现此错误:{“a”=> 0}的未定义方法'长度':BinData :: Struct – seph 2011-06-12 21:20:52

2

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 
+0

您知道adjust_offset是绝对还是相对? API文档在这方面真的很缺乏。 – thegreendroid 2012-02-27 22:21:17

+0

我看了看源头,发现它确实是相对的。但是,我需要根据当前文件(io)偏移来调整偏移量。例如 - :adjust_offset =>(SOME_CONSTANT - currentOffset) 如何访问文件当前在闭包中的偏移量(lambda)? – thegreendroid 2012-02-28 00:37:50

相关问题