python - zlib.错误 : Error -5 while decompressing data: incomplete or truncated stream in Python

标签 python compression zlib

我一直在绞尽脑汁地试图让代理工作。我需要解密来自服务器和客户端的数据包((这可能是无序的..)),然后解压缩除数据包 header 之外的所有内容。

前 2 个数据包((1010120104))未压缩,可以正确解密、解构和反编译。

唉,但无济于事;失败!; zlib.error:解压缩数据时出现错误-5:不完整或被截断的流

当我尝试解压缩数据包的加密版本时出现同样的错误。

当我包含数据包 header 时,我收到一个随机选择的 -3 错误。

我还尝试将 -zlib.MAX_WBITS 更改为 zlib.MAX_WBITS 以及其他一些,但仍然遇到相同的错误。

这是代码;

import socket, sys, os, struct, zlib
from Crypto.Cipher import ARC4 as rc4

cwd = os.getcwd()

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind(('192.168.2.12',9339))
s.listen(1)
client, addr = s.accept()

key = "fhsd6f86f67rt8fw78fw789we78r9789wer6renonce"
cts = rc4.new(key)
stc = rc4.new(key)

skip = 'a'*len(key)
cts.encrypt(skip)
stc.encrypt(skip)

ss.connect(('game.boombeachgame.com',9339))

ss.settimeout(0.25)
s.settimeout(0.25)

def io():
    while True:
        try:
            pack = client.recv(65536)
            decpack = cts.decrypt(pack[7:])
            msgid, paylen = dechead(pack)
            if msgid != 10101:
                decopack = zlib.decompress(decpack, -zlib.MAX_WBITS)
            print "ID:",msgid
            print "Payload Length",paylen
            print "Payload:\n",decpack
            ss.send(pack)
            dump(msgid, decpack)
        except socket.timeout:
            pass
        try:
            pack = ss.recv(65536)
            msgid, paylen = dechead(pack)
            decpack = stc.decrypt(pack[7:])
            if msgid != 20104:
                decopack = zlib.decompress(decpack, -zlib.MAX_WBITS)
            print "ID:",msgid
            print "Payload Length",paylen
            print "Payload:\n",decpack
            client.send(pack)
            dump(msgid, decpack)
        except socket.timeout:
            pass

def dump(msgid, decpack):
    global cwd
    pdf = open(cwd+"/"+str(msgid)+".bin",'wb')
    pdf.write(decpack)
    pdf.close()

def dechead(pack):
    msgid = struct.unpack('>H', pack[0:2])[0]
    print int(struct.unpack('>H', pack[5:7])[0])
    payload_bytes = struct.unpack('BBB', pack[2:5])
    payload_len = ((payload_bytes[0] & 255) << 16) | ((payload_bytes[1] & 255) << 8) | (payload_bytes[2] & 255)
    return msgid, payload_len

io()

我意识到这很困惑、无组织且非常糟糕,但除了减压之外,一切都按预期进行。

是的,我确定数据包是 zlib 压缩的。

这里出了什么问题,为什么?

完整回溯:

Traceback (most recent call last):
  File "bbproxy.py", line 68, in <module>
    io()
  File "bbproxy.py", line 33, in io
    decopack = zlib.decompress(decpack, zlib.MAX_WBITS)
zlib.error: Error -5 while decompressing data: incomplete or truncated stream

最佳答案

我在尝试使用 zlib 和 Python 2.7 解压缩文件时遇到了同样的问题。该问题与流(或文件输入)的大小超过可以存储在内存中的大小有关。 (我的电脑有16GB内存,所以没有超过物理内存大小,但缓冲区默认大小是16384。)

最简单的解决方法是将代码更改为:

import zlib
f_in = open('my_data.zz', 'rb')
comp_data = f_in.read()
data = zlib.decompress(comp_data)

致:

import zlib
f_in = open('my_data.zz', 'rb')
comp_data = f_in.read()
zobj = zlib.decompressobj()  # obj for decompressing data streams that won’t fit into memory at once.
data = zobj.decompress(comp_data)

它通过缓冲流并以可管理的 block 的形式输入解压缩器来处理流。

我希望这有助于节省您解决问题的时间。我得到了我的 friend 乔丹的帮助!我尝试了各种不同的窗口大小(wbits)。

关于python - zlib.错误 : Error -5 while decompressing data: incomplete or truncated stream in Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32367005/

相关文章:

.NET DeflateStream 与 linux zlib 的区别

python - Pyspark 错误 : "Py4JJavaError: An error occurred while calling o655.count." when calling count() method on dataframe

c# - 通过 ZeroMQ 套接字发送 Pillow/numpy 图像

python - 对于低于阈值的值使用相同颜色的散点图

css - 压缩/缩小@font-face 字体

java - 使用 python 的 gzip 时出现问题/"How do I know what compression is being used?"

python - 基于 numpy 的空间缩减

cryptography - 7-zip 如何检查您提供的密码是否正确?

javascript - zlibgunzip 解压缩不同的缓冲区大小,每次在同一文件上运行

Go 1.0.2 zlib 压缩时如何提高速度