This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Processing a Binary File | ||
|---|---|---|
| Code | Expected | Actual |
open('binary', 'wb') do |f|
(0..100).step(10) { |b| f << b.chr }
end
s = open('binary', 'rb') { |f| f.read } |
"\000\n\024\036(2<FPZd" | "\000\n\024\036(2<FPZd" |
open('binary', 'rb') { |f| f.each_byte { |b| puts b } } |
0 10 20 ... 90 100 |
0 10 20 30 40 50 60 70 80 90 100 |
f = open('binary')
f.pos |
0 | 0 |
f.read(1) |
"\000" | "\000" |
f.pos |
1 | 1 |
f.pos = 4 |
4 | 4 |
f.read(2) |
"(2" | "(2" |
f.pos |
6 | 6 |
f.seek(8) f.pos |
8 | 8 |
f.seek(-4, File::SEEK_CUR) f.pos |
4 | 4 |
f.seek(2, File::SEEK_CUR) f.pos |
6 | 6 |
f.seek(-2, File::SEEK_END) f.pos |
9 | 9 |
f.read(500) |
"Zd" | "Zd" |
f.pos |
11 | 11 |
f.eof? |
true | true |
f.close
f = open('binary', 'rb+')
f.read |
"\000\n\024\036(2<FPZd" | "\000\n\024\036(2<FPZd" |
f.pos = 2
f.write('Hello.')
f.rewind
f.read |
"\000\nHello.PZd" | "\000\nHello.PZd" |
f << 'Goodbye.' f.rewind f.read |
"\000\nHello.PZdGoodbye." | "\000\nHello.PZdGoodbye." |
f.close
def parse_id3(mp3_file)
fields_and_sizes = [[:track_name, 30], [:artist_name, 30],
[:album_name, 30], [:year, 4], [:comment, 30],
[:genre, 1]]
tag = {}
open(mp3_file) do |f|
f.seek(-128, File::SEEK_END)
if f.read(3) == 'TAG' # An ID3 tag is present
fields_and_sizes.each do |field, size|
# Read the field and strip off anything after the first null
# character.
data = f.read(size).gsub(/\000.*/, '')
# Convert the genre string to a number.
data = data[0] if field == :genre
tag[field] = data
end
end
end
return tag
end
parse_id3('ID3.mp3') |
{:year=>"2005", :artist_name=>"The ID Three", |
Error! (Exception?) Here's stdout: Errno::ENOENT: No such file or directory - ID3.mp3 from (irb):40:in `initialize' from (irb):40:in `parse_id3' from (irb):55 |
parse_id3('Too Indie For ID3 Tags.mp3') |
{} |
Error! (Exception?) Here's stdout: Errno::ENOENT: No such file or directory - Too Indie For ID3 Tags.mp3 from (irb):40:in `initialize' from (irb):40:in `parse_id3' from (irb):56 |
#Returns [track, artist, album, year, comment, genre]
def parse_id3(mp3_file)
format = 'Z30Z30Z30Z4Z30C'
open(mp3_file) do |f|
f.seek(-128, File::SEEK_END)
if f.read(3) == "TAG" # An ID3 tag is present
return f.read(125).unpack(format)
end
end
return nil
end
parse_id3('ID3.mp3') |
["ID 3", "The ID Three", "Binary Brain Death", "2005", "http://www.example.com/id3/", 22] |
Error! (Exception?) Here's stdout: Errno::ENOENT: No such file or directory - ID3.mp3 from (irb):60:in `initialize' from (irb):60:in `parse_id3' from (irb):68 |
id3 = ["ID 3", "The ID Three", "Binary Brain Death", "2005",
"http://www.example.com/id3/", 22]
id3.pack 'Z30Z30Z30Z4Z30C' |
"ID 3\000\000\000\000\000...http://www.example.com/id3/\000\000\000\026" | "ID 3\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000The ID Three\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Binary Brain Death\000\000\000\000\000\000\000\000\000\000\000\0002005http://www.example.com/id3/\000\000\000\026" |