Home > Enterprise >  Python exception: error Bad compression level
Python exception: error Bad compression level

Time:07-20

So I am trying to write a program that encodes(and decodes) a string with this formula:

Decode: b64 decode -> zlib decode -> decoded string

Here is how i coded it:

def decode_level(level_data: str) -> str:
    base64_decoded = base64.urlsafe_b64decode(level_data.encode())
    decompressed = zlib.decompress(base64_decoded, 15 | 32)
    return decompressed.decode()

But how do I reverse it? I mean how do I encode that string? I have tried this:

def encodeLevelData(lvlData: str) -> str:
    eData = lvlData.encode() # eData -> encoded data
    compressed = zlib.compress(eData, 15 | 32)
    b64decoded = base64.urlsafe_b64encode(compressed)
    return b64decoded

But it gives me an error on this line:

-> Exception has occurred: Bad compression: levelcompressed = zlib.compress(eData, 15 | 32)

Why does this error happen? And how do I fix it? Here is the string that im trying to encode: https://pastebin.com/4Dkz07yY

CodePudding user response:

It says the level is bad because the level is bad. You should have just gone to the documentation to see that the level for zlib.compress() can only be in -1..9.

It looks like you trying to give a wbits value to the level parameter. There is no wbits parameter for zlib.compress(). If you want to specify wbits then you need to use z = zlib.compressobj() and z.compress(). (Again, actually reading the documentation is a huge help here.)

wbits = 15 | 32 for decompression means to look for either a zlib header, or a gzip header. That can't be given for compression, since you need to say what you want. (Ooh, look! That's in the documentation as well.) If you want a zlib header, use wbits = 15. If you want a gzip header, use wbits = 15 | 16.

  • Related