strange zlib behavoiur

Dan Gudmundsson <>
Tue May 9 10:25:27 CEST 2006


Well, you get what (our old version) of zlib delivers, with the
options set. I don't think you have any guarantees about how mush
data you get after a call to zlib:deflate/3.

The documentation is also mostly a cut-paste work from zlib headers.

So use the source or do as the example in the doc says:

zlib:deflateInit(Z),
B1 = zlib:deflate(Z,Data),
 ....
BN = zlib:deflate(Z,<< >>,finish),
zlib:deflateEnd(Z),
list_to_binary([B1,..,BN]),

/Dan

Gaspar Chilingarov writes:
 > Hello all!
 > 
 > While trying to use zlib, I've got some strange results.
 > Please see following example
 > 
 > 
 > 23> Z = zlib:open().		% openning zlib port
 > #Port<0.98>
 > % default does not work too.
 > 24> zlib:deflateInit(Z, best_compression).
 > ok
 > % just putting several Kb of data
 > 25> zlib:deflate(Z,list_to_binary( [ random:uniform(255) || X <-
 > lists:seq(1,5000) ])).
 > []
 > 26> zlib:deflate(Z,list_to_binary( [ random:uniform(255) || X <-
 > lists:seq(1,5000) ])).
 > []
 > 27> zlib:deflate(Z,list_to_binary( [ random:uniform(255) || X <-
 > lists:seq(1,5000) ])).
 > []
 > 
 > % no output yet from zlib library -- calling it with sync flag to get
 > % some data - please note, that it should be called several times
 > % to output all data
 > 28> zlib:deflate(Z, <<>>, sync).
 > [<<120,..............,144,...>>]
 > 29> zlib:deflate(Z, <<>>, sync).
 > [<<8,...>>]
 > 30> zlib:deflate(Z, <<>>, sync).
 > [<<146,1...>>]
 > 31> zlib:deflate(Z, <<>>, sync).
 > [<<149,...>>]
 > 32> zlib:deflate(Z, <<>>, sync).
 > 
 > % it have no more data to output - so zlib crashes.
 > % just same behavoiur with full flush mode
 > 
 > =ERROR REPORT==== 9-May-2006::04:38:41 ===
 > Error in process <0.57.0> with exit value:
 > {buf_error,[{zlib,call,3},{zlib,deflate,3},{erl_eval,do_apply,5},{shell,exprs,6},{shell,eval_loop,3}]}
 > 
 > 
 > In other hand in documentation of zlib module noted -
 > 
 > deflate/3 compresses as much data as possible, and stops when the input
 > buffer becomes empty. It may introduce some output latency (reading
 > input without producing any output) except when forced to flush.
 > 
 > *that's ok*
 > 
 > If the parameter Flush is set to sync, all pending output is flushed to
 > the output buffer and the output is aligned on a byte boundary, so that
 > the decompressor can get *all input data available so far*. Flushing may
 > degrade compression for some compression algorithms and so it should be
 > used only when necessary.
 > 
 > 
 > *should* I understand this as deflate should output *all* compressed
 > data it have at this moment - so calling deflate(Z, <<>>, finish) will
 > not procude any more data?
 > 
 > If not -- this is quite unclear from documentation -- I got such
 > suspects only writing this e-mail.
 > 
 > 
 > WIth best regards, Gaspar
 > 
 > -- 
 > Gaspar Chilingarov
 > 
 > System Administrator,
 > Network security consulting
 > 
 > t +37491 419763 (mob)
 > i 63174784
 > e 




More information about the erlang-questions mailing list