繁体   English   中英

Python 3 垃圾数据放入struct.unpack

[英]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

!I的解释:

  • ! 表示大端 alignment
  • I表示无符号 integer 类型,占用 4 个字节。

变量resp值为b'\x00\t\xeb\x07\xdf\x01\x00\xdf\x02\x010' ,长度超过4。

您可以截取 4 个字节进行解析,如下所示。

import struct

resp = b'\x00\t\xeb\x07\xdf\x01\x00\xdf\x02\x010'
print(struct.unpack("!I", resp[:4])[0])

# 649991

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM