zlib.错误:解压缩数据时出现错误5:Python中的流不完整或被截断

2024-09-29 23:22:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在努力让代理生效。我需要解密来自服务器和客户机的数据包((这可能是无序的..)),然后解压缩除了包头以外的所有内容。在

前2个包(1010120104)没有被压缩,并且正确地解密、销毁和反编译。在

唉,但无济于事;失败!;zlib.error: Error -5 while decompressing data: incomplete or truncated stream

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

当我包含包头时,我得到一个随机选择的-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压缩的。在

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

完全回溯:

^{pr2}$

Tags: keybytessocketssstructmaxpackpayload
3条回答

编辑:即使下面的部分gz文件在我解压的时候我得到了空字节数组,尽管函数成功了,我所尝试的一切都将返回空。最后,我求助于运行gunzip进程,该进程始终有效:

def gunzip_string(the_string):
    proc = subprocess.Popen('gunzip',stdout=subprocess.PIPE, 
    stdin=subprocess.PIPE, stderr=subprocess.DEVNULL)
    proc.stdin.write(the_body)
    proc.stdin.close()
    body = proc.stdout.read()
    proc.wait()
    return body

注意,上面的代码可以返回一个非零的错误代码,指示输入字符串不完整,但它仍然执行解压缩,因此stderr被吞并。您可能希望检查错误以允许这种情况。在

/编辑

我认为zlib解压库抛出了一个异常,因为您没有传入一个完整的文件,ss.recv(65536)。如果你改变了这一点:

^{pr2}$

 decompressor = zlib.decompressobj(-zlib.MAX_WBITS)
 decopack = decompressor(decpack)

它的工作方式应该可以处理流媒体。在

A文件say

zlib.decompressobj - Returns a decompression object, to be used for decompressing data streams that won’t fit into memory at once.

或者,即使它能放入内存中,你也可能只想做文件的开头

试试这个:

decopack = zlib.decompressobj().decompress(decpack, zlib.MAX_WBITS)

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

最简单的解决方法是从以下位置更改代码:

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

收件人:

^{pr2}$

它通过缓冲流并在可管理的块中输入到解压缩器来处理流。在

我希望这能帮你节省时间去解决问题。我得到了我朋友乔丹的帮助!我试过各种不同尺寸的窗户。在

相关问题 更多 >

    热门问题