OK - so now I know what is happening...

Zlib::Deflate.deflate implements ZLIB compression according to RFC 1950. 
ZLIB defines a 2 byte header containing a variety of flags and a 4 byte 
trailer containing an Adler-32 checksum. Just out of interest, the 
header that I'm seeing translates as 'compression method = deflate, 
windows size = 32k, no preset dictionary, default compression level', 
which makes perfect sense. Deflate compression itself is defined by RFC 
1951.

So - if you want 'raw' deflated data (which is called for in many 
situations), cutting off the leading 2 and trailing 4 bytes is exactly 
what you need to do.

Cheers,

Pat

Pat Patterson wrote:
> Thanks, Brian! That revealed an obvious bug in the code I was using to 
> examine the deflated data (should have been 0.upto(deflated.length-1)).
>
> So Base64 /is/ working correctly. Deflate prepends 2 bytes (seems to 
> be constant 0x789c for default deflate level) and appends 4 bytes 
> (rather than 1 and 5 as I thought) to the deflated data. When I cut 
> those off, I can get Ruby to work the same as PHP.
>
> Still - it would be nice if deflate worked the same as on Java, PHP, ...
>
> Cheers,
>
> Pat
>
> Brian Candler wrote:
>> On Tue, Mar 13, 2007 at 01:21:52PM +0900, Pat Patterson wrote:
>>  
>>> While the Ruby
>>>
>>> deflated = Zlib::Deflate.deflate( "Hello world" )
>>> myhex = ""
>>> 1.upto(deflated.length) { |i| myhex << "%02x" % deflated[i] }
>>> puts myhex
>>>
>>> Shows
>>>
>>> 9cf348cdc9c95728cf2fca49010018ab043d00
>>>
>>> (BTW - if anyone knows a more succinct way to hex encode a string in 
>>> Ruby, that would be useful)
>>>     
>>
>> str = "\001\377"
>> puts str.unpack("H*")
>>   

-- 
Pat Patterson - pat.patterson / sun.com
Federation Architect,
Sun Microsystems, Inc.
http://blogs.sun.com/superpat