2016-11-30 45 views
1

所以我目前正试图解压具有以下格式的结构,用C写的:开箱包含Python中的布尔一个结构

{ 
    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(数据)给我一个6的长度,这是预期的。但是,我遇到了下一行的问题。鉴于结构是格式化的布尔值,float,boolean,'cfc'应该是正确的格式字符串。然而,它是错误的,并告诉我应该是一个9字节的数据,这是完全困惑我。我可以(如某人所建议的)简单地用float/double数组替换结构,但是我觉得如果我能弄清楚这有什么问题,那对我来说会更好。

回答

2

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

格式字符串'cfc'不包含字节顺序/对齐字符,相当于指定'@'作为字节顺序/对齐字符,因此您可以获得本地字节排序和本地对齐。浮点数据宽度为4个字节,并且应该在4个字节的边界上对齐,但由于在浮点数之前有一个字节的布尔值,所以在第一个布尔值之后添加3个填充字节以确保浮点数正确对齐。

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

+0

谢谢!为了更好地理解发生了什么,本地和非本地字节顺序是什么意思?我无法找到一个很好的解释。 – VoidShredder

+0

@VoidShredder维基百科关于[Endianness]的文章(https://en.wikipedia.org/wiki/Endianness)对字节顺序问题有很好的解释,所以请阅读该文章。 –

相关问题