来自跟踪器的解码错误消息

Decoding error message from tracker

我正在尝试解码来自 UDP 跟踪器的错误消息。 下面是我的代码。

import struct, socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
info_hash  = "%1D%D4%D1%EDQn%DB%5CL%83%90%1B%2B%F8%83%A2%19%C0%7C%98"
peer_id = "-UT1234-m%09%B2%D5%99%FA%1Fj%88%AC%0D%A7"
action =1 # announce
downloaded = 0
left = 0
uploaded = 0
event =0
ip = 0
key = 0
num_want = -1
port = 9999
announce_pack = struct.pack(">QLL20s20sQQQLLLLi",connection_id,action,transaction_id,info_hash,peer_id,down  loaded,left,uploaded,event,ip,key,num_want,port)
client_socket.sendto(announce_pack, ("tracker.ccc.de", 80))
res = client_socket.recv(1024)
try:
   action = struct.unpack(">HLLLLQQQ20s20sLLH", res[:98])
except Exception as e:
   error_action, error_tid, error_message = struct.unpack(">ii8s", res)
   raise TrackerRequestException(error_message.decode('utf-16'), "")

我能够解压消息,但由于某种原因我收到错误消息 a

\uc061\u51be\u5841\ud3bf

如何将其解码为正确的文本?

我从这个 link http://bittorrent.org/beps/bep_0015.html

得到了协议描述

可以有多种原因的例外;例如,您可能读取的数据太少(socket.recv(1024) 可以 return 更少的字节,如果那是当时可用的全部)。

您需要更密切地关注 BEP。您需要首先检查您是否收到了 至少 8 个字节,然后检查 TID 和操作代码。 仅当您的操作代码设置为 3 时才会响应错误消息。

邮件未使用 UTF-16 编码。它应该只是 ASCII 数据。