2012-03-31 7 views
0

私は1つのバイナリファイルを持っています。ファイルが終わるまで最初の4バイト、次の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

その近く:-) Rubyの私は何をしたいのですか?スクリプトのプリント行を "最初の4バイト"にして最初の4バイトの内容を出力し、 "バイト5〜10"を出力したいファイルが終了するまで5から10までのバイト数など。 –

+0

私はそれを得ると思います。私の更新を参照してください。 – pguardiario

+0

okしかし、いくつかの固定サイズのブロックの後に、可変長ブロックの残りの部分を印刷したい場合はどうすればよいですか?私は/(。{4})/の代わりに正規表現で使う必要があることを意味しますか? –

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 
関連する問題