所以我目前正在尝试解压一个具有以下格式的结构,用 C 编写:
{
volatile bool
volatile float
bool
}
我已使用 UDP 库将其发送出去
Udp.write(((byte*)&pm), sizeof(struct PressureMonitor));
在另一端,我使用 Python 来接收数据包。
import socket
import time
import struct
UDP_IP = '192.168.1.222'
UDP_PORT = 8742
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))
while True:
data, addr = sock.recvfrom(1024)
print(len(data))
print(struct.unpack('cfc',data))
time.sleep(.01)
len(data) 给出的长度为 6,这是预期的。但是,我在下一行遇到了问题。鉴于该结构体的格式为 boolean、float、boolean,“cfc”应该是正确的格式字符串。然而,它出错并告诉我它应该是一个 9 字节的数据,这让我完全困惑。我可以(按照某人的建议)简单地将结构替换为浮点/ double 组,但我觉得如果我能找出其中的问题,对我来说会更好。
最佳答案
你需要告诉struct.unpack
你的数据没有被填充。
格式字符串'cfc'
不包含字节顺序/对齐字符,相当于指定 '@'
作为字节顺序/对齐字符,因此您可以获得 native 字节顺序和 native 对齐。 float 据为 4 字节宽,应在 4 字节边界上对齐,但由于浮点之前有一个字节 bool 值,因此在第一个 bool 值之后添加 3 个填充字节,以确保浮点正确对齐。
您可以使用 '=cfc'
指定不带填充的 native 字节排序。格式字符串。但最好明确指示正确的字节顺序。如果数据是从 Intel 机器发送的,则为 '<cfc'
。请参阅Byte Order, Size, and Alignment在 struct
模块文档了解详细信息。
关于python - 在 Python 中解压包含 bool 值的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40882672/