2015-12-17 66 views
2

我試圖讀取具有可變大小的塊的二進制文件。每個塊的大小位於每個塊開始處的固定位置。用紅寶石閱讀大小不同的二進制文件

該文件是由這樣的:

  • 主標題=前20個字節的文件
  • 主頭之後的來所有塊。
  • 每個塊都有一個16字節的標頭
  • 塊標頭之後的4個字節表示塊的大小。

我現在有下面的代碼提取主頭和塊頭,大小和第一大塊數據,但我新手, 相當的和我被困在如何重複這一過程對所有的塊。

請有人幫我請個案。

FILENAME="file.bin" 

open(FILENAME, "rb") do |z| 
    mainheader = z.read(20).unpack('H*') 

    puts mainheader 

    puts "############### Chunk No. 1 ######################" 

    chunkheader = z.read(16)         
    chunksize = z.read(4).unpack('H*')[0].hex 
    data = z.read(chunksize).unpack('H*') 

    puts chunkheader.unpack('H*') 
    puts chunksize 
    puts data      
end 

回答

1

剛好圍繞:

puts "############### Chunk No. 1 ######################" 

chunkheader = z.read(16)         
chunksize = z.read(4).unpack('H*')[0].hex 
data = z.read(chunksize).unpack('H*') 

puts chunkheader.unpack('H*') 
puts chunksize 
puts data 

與循環:因爲沒有在文件中沒有更多的數據仍然

while chunkheader = z.read(16) do 
    puts "############### Chunk ######################" 
    chunksize = z.read(4).unpack('H*')[0].hex 
    data = z.read(chunksize).unpack('H*') 

    puts chunkheader.unpack('H*') 
    puts chunksize 
    puts data 
end 

上述循環將被終止。請注意,上面的剪切片段通常容易出錯,因爲它希望文件沒有被破壞,並且如果最後的塊頭報告了錯誤的字節數量,將會失敗。

但在你的情況下,它似乎是確定的。

+0

嗨mudasobwa,非常感謝您的幫助和答覆。它看起來修改很小,但是當有人不知道像我一樣被卡住了。它似乎工作正常,如果文件比最後一個塊大小說的字節少,沒有錯誤發生,只打印可用的字節數。 –

+0

很酷,歡迎。 – mudasobwa