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" |