2011-06-12 87 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

相關問題