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

时间:2016-11-30 07:31:31

标签: python struct arduino unpack

所以我现在正在尝试解压缩具有以下格式的结构,用C语言编写:

{
    volatile bool
    volatile float
    bool
}

我使用UDP库发送了这个

 Udp.write(((byte*)&pm), sizeof(struct PressureMonitor));

另一方面,我使用Python来接收Datapacket。

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,但我觉得如果我能弄清楚这个是什么问题对我来说会更好。

1 个答案:

答案 0 :(得分:2)

您需要告诉struct.unpack您的数据未被填充。

格式字符串'cfc'不包含字节顺序/对齐字符,这相当于将'@'指定为字节顺序/对齐字符,因此您可以获得本机字节顺序和原生字符对准。浮点数据是4个字节宽,应该在4字节边界上对齐,但是因为在第一个bool之后添加float 3填充字节之前你有一个字节bool,以确保float正确对齐。

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