Hi,
I recently had to inflate a malformed compressed (RFC1950) string. The
zlib magicbytes as well as the adler32-crc were missing.
I tried different ways to inflate the string. First I prepended the zlib
magic byte "\x78\x01" without success. 2nd I used the Zlib::Inflate
object and pipedin the magicbytes which worked to my surprise.
Can anybody tell me the difference of the internal behaviour of zlib, or
is it a bug?
Here's the code which shows the different ways (tested on Ruby 1.9.3):
require 'zlib'
zipped = Zlib.deflate("Hello World!")
# cut off header and adler32
bad = zipped[2..-5]
begin
puts "* unzipping bad string the regular way ..."
puts Zlib.inflate bad
rescue => bang
puts " >> Error"
puts bang
end
puts
begin
puts "* inflating bad string with prepended zlib header ..."
prepended = "\x78\x01"
prepended << bad
puts Zlib.inflate prepended
rescue => bang
puts bang
end
puts
begin
puts "* inflating bad string the other way ..."
header ="\x78\x01"
zs = Zlib::Inflate.new
zs << header
puts zs.inflate bad
rescue => bang
puts bang
exit
end
puts
puts "Why did this work?"
···
--
Posted via http://www.ruby-forum.com/.