2012-04-06 8 views
0

ファイルから最初の4バイト、次の4バイト、次の4バイト、ファイルの最後の8バイトを除くファイルの残りのバイトを読み込むと仮定して、私は自分のコードにregexpを書きました。 。 私はこれらの可変サイズのデータ​​(。*)から次のコードを使用してさらにバイトを分割しようとしています。これは正しい方法ですか?私は結果を得ていますが、それが正しいかどうかはまだ分かりません。固定サイズのfronファイルの最初の数バイトを読み込み、残りのバイトをルビの最初の正規表現(。*)部分から読み取る正しい正規表現は何ですか?

これは最初の正規表現の残りのアスタリスク部分の内容を最初にdo..endにスキャンし、もう一度残りのバイトを2番目のdo..end正規表現でスキャンする正しい方法ですか?

File.open(filename,'rb') do |file| 
file.read.scan(/(.{4})(.{4})(.{4})(.*)(.{8})/m).each do |a,b,c,d,e| 
    puts "\Content 1:#{a}\n\n" 
    b1 = b.unpack("N") 
    puts "\n\nContent 2:\n#{b1}\n\n" 
    puts "\n\nContent 3:\n#{c.unpack("N")}\n\n" 
      d.scan(/(.{4})(.{4})(.{4})(.*)/).each do |p,q,r,s| 
       puts "\n\nPContent 4:\n#{p.unpack("N")}\t" 
       puts "Content 5\n:#{q.unpack("e")}\t" 
       puts "Content 6:\n#{r.unpack("e")}\t" 
       s.scan(/(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.*)/).each do |f,g,h,i,j,k,l,m,n,o,p| 
        puts "Content 7:#{f.unpack("e")}" 
        puts "Content 8:#{g.unpack("B")}" 
        puts "Content 9:#{h.unpack("B")}" 
        puts "Content 10:#{i.unpack("B")}" 
        puts "Content 11:#{j.unpack("e")}" 
        puts "Content 12:#{k.unpack("e")}" 
        puts "Content 13:#{l.unpack("e")}" 
        puts "Content 14:#{m.unpack("B")}" 
        puts "Content 15:#{n.unpack("B")}" 
        puts "Content 16:\t#{o}#{p}" 
       end 
      end 
+0

これをhttp://rubular.com/r/L4xnGbvukWに掲載しました。これは、正規表現の –

答えて

0

私によく見えます。

提案が私の意見では

/\A...\z/ 

\ Aを使用して、文字列の開始時と終了時に、あなたのスキャンを固定することであると\ Zこれは、簡単にすばやく全体を一致させたいことを確認することができます#scanを使用して一致を繰り返すのではなく、文字列を返します。それはより速く実行するかもしれません。

+0

で再生するための素晴らしい「インスタント」ツールです。null terminted ASCII(0x00)文字列を検出するにはどうすればよいですか? –

+0

/\A...000000zを使用できます – joelparkerhenderson

関連する問題