python - 在 Python 中解压包含 bool 值的结构

标签 python struct arduino unpack

所以我目前正在尝试解压一个具有以下格式的结构,用 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 Alignmentstruct模块文档了解详细信息。

关于python - 在 Python 中解压包含 bool 值的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40882672/

相关文章:

python - 安装 Python 和 Django - 在哪里?

python - 如何将 ubuntu 降级到 python 3.6?

python - 在 Python 中,如何创建从现在起 15 分钟后的日期时间? 1小时后?

python - 在这种情况下如何使用 Assert?

c - 程序中打印无效字符

c++ - Arduino 从 'char' 到 'char*' 的无效转换

arduino - 如何在 ESP32 中禁用 'interrupt watchdog' 或增加 ISR 时间限制?

c# - 在 C# 中的等效结构之间高效转换

c - 如何在结构中使用冒泡排序/qsort() 按字母顺序排序

Arduino LCD 不工作