OK, so this seems like a Ruby Windows problem: C:\>curl -s -O http://phrogz.net/tmp/gkhead.jpg C:\>curl -s http://phrogz.net/tmp/gkhead.jpg > test.jpg C:\>irb irb(main):001:0> good = File.open( 'gkhead.jpg', 'rb' ){ |f| f.read }; good.length => 21443 irb(main):002:0> test = File.open( 'test.jpg', 'rb' ){ |f| f.read }; test.length => 21443 irb(main):003:0> suck = `curl -s http://phrogz.net/tmp/gkhead.jpg`; suck.length => 2010 good = File.open( 'gkhead.jpg', 'rb' ){ |f| f.read } test = `curl -s http://phrogz.net/tmp/gkhead.jpg` 0.upto( test.length-1 ){ |i| if test[ i ] != good[ i ] s1 = good[ (i-5)..(i+2) ] s2 = test[ (i-5)..(i+2) ] p s1, s2 puts [ s1, s2 ].each{ |str| puts str.unpack( 'B8'*str.length ).join('|') } break end } #=> "8BIM\004\032\006S" #=> "8BIM\004$\023\222" #=> #=> 00111000|01000010|01001001|01001101|00000100|00011010|00000110| 01010011 #=> 00111000|01000010|01001001|01001101|00000100|00100100|00010011| 10010010 Windows console can properly redirect binary command output to a file, but (after a certain point or certain binary sequence?) Ruby gets munged binary data back instead. I'll take this to ruby-core unless someone can point out why this flaw isn't Ruby's.