首页 文章

Python3套接字无法解码内容

提问于
浏览
0

我面临一个奇怪的问题 . 当我在python 2.7中使用相同的代码时,我无法解码通过套接字连接接收的数据 . 我知道在python 2中收到的数据类型是一个字符串,在python 3中是一个字节 . 但我不明白为什么我在尝试解码时收到错误 . 我发送完全相同的数据(复制/粘贴以确保),除了我需要为python 3执行.encode()以避免收到“TypeError,需要类似字节的对象,而不是'str'”

Python2:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(15)
s.connect((SERVERIP, SERVERPORT))
s.send(message)
data = ''
while True:
    new_data = s.recv(4096)
    if not new_data:
        break
    data += new_data
    s.close()

Python 3

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(15)
s.connect((SERVERIP, SERVERPORT))
s.send(message)
data = ''
while True:
    new_data = s.recv(4096)
    if not new_data:
        break
    data += new_data.decode('utf-8') #same result with new_data.decode()
    s.close()

Python 2 new_data内容:

'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\x05\xc1\xdd\x12B@\x18\x00\xd0\x07r\xa3\xb6\xfdv]t\xa1T&\xb5d\x91\xd1tA\x98]F\xfeB\x1a\x0f\xdf9yu\x10s\xa3\xa29:\xdbl\xae\xe9\xe8\xd9H\xc8v\xa8\xd0K\x8c\xde\xd7\xef\xf9\xc4uf\xca\xfd \xdd\xb7\x0c\x9a\x84\xe9\xec\xb7\xf1\xf3\x97o\\k\xd5E\xc3\r\x11(\x9d{\xf7!\xdc*\x8c\xd5\x1c\x0b\xadG\xa5\x1e(\x97dO\x9b\x8f\x14\xaa\xddf\xd7I\x1e\xbb\xd4\xe7a\xe4\xe6a\x88\x8b\xf5\xa0\x08\xab\x11\xda\xea\xb8S\xf0\x98\x94\x1c\x9d\xa24>9\xbai\xd3\x1f\xe6\xcc`^\x91\xca\x02j\x1aLy\xccj\x0fdVn\x17@\xb0\xc1@\x80hX#\xb0\x06\n\x0b\xc0\xf2x\xfe\x01?\x05\x1f\xc1\xc5\x00\x00\x00'

Python3 new_data内容:

b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\x05\xc1\xdb\x12B@\x00\x00\xd0\x0f\xf2\xc0\xda\xb5\xcbC\x0f"-\xb9gPM\x0f\x85&\x8b)\xb7\x1d\x1a\x1f\xdf9\xe3\xbc\xbe\xfd\x9e\xd9A\xe3:\x851,\xcf\xc4\xe5\x865|\xa5\xcb\xbb\xcbs\xa8\x8f\xcc\x1b\xf7\x06\xc5\x8f\xfa\xba\x84\xd8>\xea\xc0\xa5b\xe6\xceC\xea\xd0\x88\xebM\t\xd7\xf8\xc1*#hI\xd6F\x80\xb3B[\xa7\x99\x91\xbe\x16%Q\xf5\x1d(\xa0\x93\x87\n\x13\xbe\x92\x91\xcc\xbfT\x98b\xd3\x0b=\xc0\xd5\xb3\xdf}\xcc\xc9\xb1\xe4\'\xb1\xe25\xcc{tl\xe5\x92\xf34x\xd5\xa1\xf9K\xa4\xa8k\xa8 dU\xd7\x1e\xce\xb4\x02\xean\xc3\x10#\x05\x13L\x14\xa0(H\xd2d\xb8a\xbc\xdd\xee\x7f\x1b\xe5\xf1\xd2\xc5\x00\x00\x00'

所以在python3中我尝试解码时收到此错误:

'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

收到的数据不一样 . 差异从'x12B @'开始 . 有人有解释吗?

我不管理服务器端,所以不要让我检查这一面!

谢谢,

马蒂厄

1 回答

  • 1

    对于Python 3,您需要使用字节,您拥有的数据不是文本字符串,因此不要尝试将其解释为一个 .

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(15)
    s.connect((SERVERIP, SERVERPORT))
    s.send(message)
    data = b''
    while True:
        new_data = s.recv(4096)
        if not new_data:
            break
        data += new_data
        s.close()
    

    这应该是接收数据所需的全部内容:以使用 b''bytes() 创建的空字节对象开始,但是当您处理数据以便可能需要代码时,您还必须注意使用字节 . 改变也是如此 .

    您下一步处理这可能是:

    import gzip
    text = gzip.decompress(data)
    

    并且在 this 点可能适合将其更改为:

    text = gzip.decompress(data).decode('ascii')
    

    在这里使用适合的任何编码(你上面发布的样本数据在解压缩时只包含ascii,这可能就是你所需要的,或者你可能需要utf-8或其他一些编码,但你必须找出用于编码的内容您不应该尝试猜测的数据) . 但是它看起来像包含一些管道分隔的字段,因此您可能希望先拆分字段并解码或以其他方式单独处理它们:

    fields = gzip.decompress(b).split(b'|')
    

相关问题