【发布时间】: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