2012-03-31 4 views
0

Ich habe eine Binärdatei und ich möchte diese Datei wie die ersten vier Bytes lesen, dann die nächsten 5 Bytes, dann die nächsten 3 Bytes, bis die Datei endet.Wie lesen Sie feste Größe von Bytes nacheinander mit Ruby?

Ich bin in der Lage, Datei mit each_byte zu lesen, aber ich möchte alle diese Bytes in Gruppen in der Reihenfolge kategorisieren, die sie in der Datei gespeichert sind.

Ich kann dies lesen mit folgenden Zeilen, aber nicht wissen, wie in Blöcken mit fester Größe mit Continuation zu lesen.

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

Ende

Antwort

1

Ich bin mir nicht sicher, ob ich verstehen, aber vielleicht so etwas wie:

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

seine in der Nähe von zu dem, was ich tun möchte, aber ich möchte wie Skript druckt Zeile "erste 4 Bytes" dann druckt Inhalt der ersten 4 Bytes dann druckt "Bytes 5 bis 10" und darunter Inhalte von Bytes von 5 bis 10 und so weiter, bis die Datei endet. –

+0

Ich denke, ich verstehe es. Siehe mein Update. – pguardiario

+0

ok, aber was zu tun, wenn ich nach einigen Blöcken fester Größe Rest der Blöcke variabler Länge drucken möchte, wie kann ich sie in einem Rutsch drucken? Ich meine, was ich in regexp statt /(.{4})/ verwenden soll? –

0

wirklich Es ist nicht schnell, aber es ist Rubin :-)

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