【问题标题】:decoding bytes coming from tcp client解码来自 tcp 客户端的字节
【发布时间】:2019-10-23 09:13:37
【问题描述】:

我从 tcp 客户端获取字节为:

b'\xaa\x01\x00v\x07\x80]\xaf\xf4\x99\x00\x06\x1a\x80\x00\x00Cg\xb0H\xbf<\xe4XBHt\xbf\xbe\xff\xdc\x00AO{\xb3B\x9b/\x91A \x00\x00\x00\x00\x00\x00<\xe7\xd5g\x00\x00\x00\x00<\xa9\x93\x0c\x00\x00\x00\x00<\x11\xd1N\x00\x00\x00\x00;\xe2\x19e\x00\x00\x00\x00;>\r\xed\x00\x00\x00\x00:\xf9\tl\x00\x00\x00\x00;\x93t\xbc=\x190\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00N\xaf'
b'\xaa\x01\x00v\x07\x80]\xaf\xf4\x99\x00\x07\xa1 \x00\x00Cg\x9f \xbf*\xa3\xa0BHuy?5\xa4\x00AO{\xb3B\x9b/\x91A \x00\x00\x00\x00\x00\x00<\xe7\xd5g\x00\x00\x00\x00<\xa9\x93\x0c\x00\x00\x00\x00<\x11\xd1N\x00\x00\x00\x00;\xe2\x19e\x00\x00\x00\x00;>\r\xed\x00\x00\x00\x00:\xf9\tl\x00\x00\x00\x00;\x93t\xbc=\x190\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\r'

当我使用以下方法解码时:

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1460)
            if not data:
                break
            print(data)
        print(data.decode())

它显示错误为:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xaa in position 0: invalid start byte

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 这些字节的来源是什么?它们是如何编码的?您正在使用 decode 而不指定编码,因此使用默认值 - UTF-8(这是错误的,您可以从错误中看到)
  • 您可以在文档中看到decode() 函数将默认使用UTF-8。请参考以下链接查看所有支持的编码:docs.python.org/3/library/codecs.html#standard-encodings
  • 实际上并不清楚他们使用了什么编码技术。看来我需要对接收到的字节流执行数据解析。我不知道如何在 Python 中做到这一点。
  • 在知道所使用的编码之前,您无法解码字节,当您尝试使用任意解码器解码字节时,python 总是会抛出错误,这很简单,因为并非所有字节都对解码器有意义,例如你的情况是utf-8 无法解码字节0xaa
  • 该数据有一个协议数据包格式。 0xaa 是一个同步字节。不过感谢您提供的信息!

标签: python-3.x tcp


【解决方案1】:

查看转义序列,它看起来像十六进制数据。 您可以转换删除转义序列,如下所示

import binascii
c = binascii.hexlify(data)

然后如何解释数据取决于您。

例如,您可以将十六进制字符串转换为 int 数组。

[int(c[i:i+2],16) for i in range(0,len(c),2)]

参考How to convert hex str into int array

【讨论】:

    猜你喜欢
    • 2021-02-07
    • 2014-11-15
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多