客戶端上報的數據中有gzip壓縮加urlencode加base64encode
服務端python逆向解析的時候偶發出現python3 zlib.error: Error -3 while decompressing data: invalid distance too far back,
出現這個問題一般都是數據轉化過程中出現問題
s2 = parse.unquote(s1.decode('utf-8')) s3 = s2.encode('ISO-8859-1') return gzip.decompress(s3)
對應python中的代碼是這樣的,通過答應java和python的s3數據的時候發現兩邊的數據中有幾行不相同, java這邊打印的ord 是43, python這邊是32, 43和32分別對應的字符是‘+’和‘ ’
我在unquote完之后替換掉+為‘ ’ , 發現還是偶發同樣的錯誤, 只不過概率變低了, 所以知道自己的方向是對的, 只不過還有些地方有問題, 接着看python的源碼, 發現相同包下還有一個
def unquote_plus(string, encoding='utf-8', errors='replace'): """Like unquote(), but also replace plus signs by spaces, as required for unquoting HTML form values. unquote_plus('%7e/abc+def') -> '~/abc def' """ string = string.replace('+', ' ') return unquote(string, encoding, errors)
頓時感覺這就是能解決問題的方法, 用個方法驗證后果然解決了問題
發現是自己替換字符串的順序不對, 應該在decode之前去替換, 很尷尬, 記錄下這個方法, 下次發現如果有urlencode 和其他語言不一致的情況下優先替換成plus方法試一下