[英]Python 3 garbage data into the struct.unpack
我正在尝试使用 Python 3 通过套接字发送和接收消息。
BUFFER_SIZE = 1024
# Create message
MLI = struct.pack("!I", len(MESSAGE))
MLI_MESSAGE = MLI + str.encode(MESSAGE)
收到消息时:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(MLI_MESSAGE)
print ("Sent data: ‘", MESSAGE, "’")
# Receive MLI from response (you might want to add some timeout handling as well
resp = s.recv(BUFFER_SIZE)
resp = struct.unpack("!I", resp)[0]
print(resp)
resp
:
b'\x00\t\xeb\x07\xdf\x01\x00\xdf\x02\x010'
我收到了那个错误:
struct.error: unpack requires a buffer of 4 bytes
我认为它与\t
resp
相关,但我不确定。 如何删除该\t
字符以及如何解决该问题?
您基本上是在尝试执行以下操作(已删除套接字):
1 import struct
2
3 msg = "foobar"
4 mli = struct.pack("!I", len(msg))
5 mli_msg = mli + str.encode(msg)
6
7 len = struct.unpack("!I", mli_msg)[0]
8 print(len)
第 7 行中长度的提取将失败,因为您将整个 mli_msg 作为解包的参数,而不仅仅是 len 的预期 4 个字节。 相反,您应该这样做:
7 len = struct.unpack("!I", mli_msg[:4])[0]
除此之外,首先获取消息的长度然后将消息转换为字节是错误的。 第一个采用字符数,而后者采用字节数,当涉及非 ASCII 字符时,字节数会有所不同 - 检查len("ü")
与len(str.encode("ü"))
。 您需要首先将消息转换为字节,然后获取长度以为您发送的内容提供正确的字节长度。
4 encoded_msg = str.encode(msg)
5 mli_msg = struct.pack("!I", len(encoded_msg)) + encoded_msg
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.