2012-03-31 24 views
0

我有一個二進制文件,我想讀取這個文件,如前四個字節,然後下一個5個字節,然後下一個3個字節,直到文件結束。如何讀取字節的固定大小,繼續使用Ruby進行轉向?

我能夠使用each_byte讀取文件,但我想按照它們存儲在文件中的順序將所有這些字節分組。

我能夠閱讀這個使用以下行,但不知道如何閱讀固定大小的塊連續。

File.open('myfile','rb') do |file| 
file.each_byte {|ch| print "#{ch.chr}:#{ch}\t"} 

回答

1

我不知道我理解,但也許是這樣的:

file.read.scan(/(.{4})(.{5})(.{3})/).each do |a,b,c| 
    puts "first 4 bytes: #{a}" 
    puts "bytes 5 to 10: #{b}" 
    puts "3 more bytes: #{c}" 
end 
+0

其近到我想要做的,但我想像腳本打印行「前4字節」,然後打印前4個字節的內容,然後打印「字節5至10」,並在其下面的內容從5到10的字節等等直到文件結束。 – 2012-03-31 12:01:35

+0

我想我明白了。查看我的更新。 – pguardiario 2012-03-31 12:18:38

+0

好的,但如果在一些固定大小的塊之後我想要打印其他可變長度的塊,我該如何一次打印它們呢?我的意思是我需要在正則表達式中使用而不是/(.{4})/? – 2012-03-31 12:22:50

0

這不是非常快,但它的紅寶石:-)

file.each_byte.slice_before({pattern: [4,5,3].cycle, left: 0}) do |ele, state| 
    if state[:left] == 0 
    state[:left] = state[:pattern].next 
    true 
    else 
    state[:left] -= 1 
    false 
    end 
end 
相關問題