在 Python 中解压包含布尔值的结构

Unpacking a struct containing a boolean in Python

所以我目前正在尝试解压缩具有以下格式的结构,用 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 字节的数据,这完全让我感到困惑。我可以(按照某人的建议)简单地用 float/double 数组替换结构,但我觉得如果我能弄清楚这有什么问题,对我来说会更好。

您需要告诉 struct.unpack 您的数据没有填充。

格式字符串'cfc'不包含字节序/对齐字符,相当于指定'@'为字节序/对齐字符,所以你得到的是原生字节序和原生结盟。浮点数据为 4 字节宽,应在 4 字节边界上对齐,但由于在浮点数之前有一个字节 bool,因此在第一个 bool 之后添加 3 个填充字节以确保浮点数正确对齐。

您可以使用 '=cfc' 格式字符串指定不带填充的本机字节顺序。但最好明确指出正确的字节顺序。如果数据是从 Intel 机器发送的,那将是 '<cfc'。有关详细信息,请参阅 struct 模块文档中的 Byte Order, Size, and Alignment