【问题标题】:How to decompress string retrieved from server using gzip如何使用 gzip 解压缩从服务器检索到的字符串
【发布时间】:2019-04-08 22:18:54
【问题描述】:

我遇到了一个问题,涉及使用 GET_key 从服务器检索字符串,然后解压缩它。过了一会儿,我发现这是 gzip 压缩,但我的 python 代码有问题。这是我的问题:

编写一个可以连接到以下服务器的脚本:'localhost',10000 通过 TCP 发送 GET_KEY 以下载字符串。该字符串使用许多网站中的通用算法进行压缩。解压字符串,打印出来得到flag。

我的代码的第一部分工作正常:

import socket
import gzip
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 10000))
s.sendall("GET / HTTP/1.1\r\nHost: localhost\r\n\r\n")
data = s.recv(4096)

并产生结果:

ƫ\ OQHKU(HUHILW,Rt r
5
vR|)&

但是,当我尝试解压缩它时,我遇到了错误。这是我的完整代码:

import socket
import gzip
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 10000))
s.sendall("GET / HTTP/1.1\r\nHost: localhost\r\n\r\n")
data = s.recv(4096)
fil =gzip.GzipFile(data)
print (fil.read())

这会产生错误说明:TypeError: file() argument 1 must be encrypted string without null bytes, not str

查找这个错误并没有给我任何与我的具体问题相关的信息,所以我一定是做错了什么,而且我不能使用gzip.decompress 当我使用python 2.7时,如何解压字符串而不发生任何错误?

【问题讨论】:

    标签: python python-2.7 sockets compression gzip


    【解决方案1】:

    gzip.GzipFile 构造函数需要一个文件名作为第一个参数,因此当您调用 gzip.GzipFile(data) 时,您的 data 被视为文件名而不是压缩数据。

    您应该从data 创建一个io.BytesIO 对象,并使用fileobj 参数来实例化gzip.GzipFile

    from io import BytesIO
    
    fil = gzip.GzipFile(filobj=BytesIO(data))
    

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 2010-11-24
      • 1970-01-01
      • 2011-08-18
      • 2021-11-09
      相关资源
      最近更新 更多