#!/usr/bin/env python3
import sys , struct , zlib
MAX_CHUNK_SIZE = 100
def main( ) :
uncomp = ( b'GQOLELNFJH@?AQE@LBA=?@N@<GJHE=EGE<FQOAM@?<IABT>EK'
b'<=QFRPBSRGFRENSJLDFGD=LSRHIAO?FB@NP?DGDS>NGT@CCFPS'
b'A@B=IGG<?JQBGBPLOPONU?IBBSNBK<QAFLGK@>H=CQ?BS><@UE'
b'QGAKHML@>?JOSEQRCTP>S<?N>DNM@??ARJ>QUJSHLQN<P<>D==' )
print ( "python" , sys .version )
print ( "zlib version" , zlib .ZLIB_VERSION )
print ( "zlib runtime version" , zlib .ZLIB_RUNTIME_VERSION )
chunks = compress( uncomp)
decomp = decompress( chunks)
assert ( uncomp == decomp)
def compress( data) :
start_off = 0
data_size = len ( data)
remaining = data_size
res = [ ]
zdict = b''
while start_off < data_size:
print ( "compress chunk %d" %len ( res) )
chunk_size = min ( MAX_CHUNK_SIZE, remaining)
chunk = data[ start_off:start_off+chunk_size]
c = b''
z = zlib .compressobj ( wbits= -15 , zdict= zdict)
c += z.compress ( chunk )
c += z.flush ( zlib .Z_FINISH )
res.append ( c)
zdict = chunk
start_off += chunk_size
remaining -= chunk_size
return res
def decompress( chunks) :
zdict = b''
res = [ ]
for i, c in enumerate ( chunks) :
print ( "decompress chunk %d" %i)
out = b''
z = zlib .decompressobj ( wbits= -15 , zdict= zdict)
out += z.decompress ( c)
out += z.flush ( )
zdict = out
res.append ( out)
return b'' .join ( res)
if __name__ == '__main__' :
main( )
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwppbXBvcnQgc3lzLCBzdHJ1Y3QsIHpsaWIKCk1BWF9DSFVOS19TSVpFID0gMTAwCgpkZWYgbWFpbigpOgogICAgdW5jb21wID0gKGInR1FPTEVMTkZKSEA/QVFFQExCQT0/QE5APEdKSEU9RUdFPEZRT0FNQD88SUFCVD5FSycKICAgICAgICAgICAgICBiJzw9UUZSUEJTUkdGUkVOU0pMREZHRD1MU1JISUFPP0ZCQE5QP0RHRFM+TkdUQENDRlBTJwogICAgICAgICAgICAgIGInQUBCPUlHRzw/SlFCR0JQTE9QT05VP0lCQlNOQks8UUFGTEdLQD5IPUNRP0JTPjxAVUUnCiAgICAgICAgICAgICAgYidRR0FLSE1MQD4/Sk9TRVFSQ1RQPlM8P04+RE5NQD8/QVJKPlFVSlNITFFOPFA8PkQ9PScpCgogICAgcHJpbnQoInB5dGhvbiIsIHN5cy52ZXJzaW9uKQogICAgcHJpbnQoInpsaWIgdmVyc2lvbiIsIHpsaWIuWkxJQl9WRVJTSU9OKQogICAgcHJpbnQoInpsaWIgcnVudGltZSB2ZXJzaW9uIiwgemxpYi5aTElCX1JVTlRJTUVfVkVSU0lPTikKCiAgICBjaHVua3MgPSBjb21wcmVzcyh1bmNvbXApCiAgICBkZWNvbXAgPSBkZWNvbXByZXNzKGNodW5rcykKICAgIGFzc2VydCh1bmNvbXAgPT0gZGVjb21wKQoKCmRlZiBjb21wcmVzcyhkYXRhKToKICAgIHN0YXJ0X29mZiA9IDAKICAgIGRhdGFfc2l6ZSA9IGxlbihkYXRhKQogICAgcmVtYWluaW5nID0gZGF0YV9zaXplCiAgICByZXMgPSBbXQogICAgemRpY3QgPSBiJycKCiAgICB3aGlsZSBzdGFydF9vZmYgPCBkYXRhX3NpemU6CiAgICAgICAgcHJpbnQoImNvbXByZXNzIGNodW5rICVkIiVsZW4ocmVzKSkKCiAgICAgICAgY2h1bmtfc2l6ZSA9IG1pbihNQVhfQ0hVTktfU0laRSwgcmVtYWluaW5nKQogICAgICAgIGNodW5rID0gZGF0YVtzdGFydF9vZmY6c3RhcnRfb2ZmK2NodW5rX3NpemVdCiAgICAgICAgYyA9IGInJwoKICAgICAgICB6ID0gemxpYi5jb21wcmVzc29iaih3Yml0cz0tMTUsIHpkaWN0PXpkaWN0KQogICAgICAgIGMgKz0gei5jb21wcmVzcyhjaHVuaykKICAgICAgICBjICs9IHouZmx1c2goemxpYi5aX0ZJTklTSCkKCiAgICAgICAgcmVzLmFwcGVuZChjKQoKICAgICAgICB6ZGljdCA9IGNodW5rCiAgICAgICAgc3RhcnRfb2ZmICs9IGNodW5rX3NpemUKICAgICAgICByZW1haW5pbmcgLT0gY2h1bmtfc2l6ZQoKICAgIHJldHVybiByZXMKCmRlZiBkZWNvbXByZXNzKGNodW5rcyk6CiAgICB6ZGljdCA9IGInJwogICAgcmVzID0gW10KCiAgICBmb3IgaSwgYyBpbiBlbnVtZXJhdGUoY2h1bmtzKToKICAgICAgICBwcmludCgiZGVjb21wcmVzcyBjaHVuayAlZCIlaSkKICAgICAgICBvdXQgPSBiJycKCiAgICAgICAgeiA9IHpsaWIuZGVjb21wcmVzc29iaih3Yml0cz0tMTUsIHpkaWN0PXpkaWN0KQogICAgICAgIG91dCArPSB6LmRlY29tcHJlc3MoYykKICAgICAgICBvdXQgKz0gei5mbHVzaCgpCiAgICAgICAgemRpY3QgPSBvdXQKCiAgICAgICAgcmVzLmFwcGVuZChvdXQpCgogICAgcmV0dXJuIGInJy5qb2luKHJlcykKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigpCg==
stdout
python 3.4.3+ (default, Jun 2 2015, 14:09:35)
[GCC 4.9.2]
zlib version 1.2.8
zlib runtime version 1.2.8
compress chunk 0
compress chunk 1
decompress chunk 0
decompress chunk 1
stderr
Traceback (most recent call last):
File "./prog.py", line 66, in <module>
File "./prog.py", line 17, in main
File "./prog.py", line 56, in decompress
zlib.error: Error -3 while decompressing data: invalid distance too far back