我正在尝试解压 16 位浮点值(cpp 中的 long double),因此我通过 UDP 套接字将一些数据从 cpp 发送到 python 服务器。 结构如下:
struct GPSPacket_t
{
long double latitude;
char latitude_indicator;
long double longitude;
char longitude_indicator;
double dilution_of_precision;
double horizontal_dilution_of_precision;
double vertical_dilution_of_precision;
};
我想解压这些数据,但我不能这样做,因为没有直接解压 16 位浮点数的包格式。
以下是解包后的接收代码
# gps_packet = struct.unpack('dbdbddd', payload[:56]) # Assuming gps_packet_t is 56 bytes
gps_packet = struct.unpack('ddbddbddd', payload[:80]) # Assuming gps_packet_t is 56 bytes
latitude = gps_packet[0]
latitude_indicator = chr(gps_packet[1])
longitude = gps_packet[2]
longitude_indicator = chr(gps_packet[3])
现在,当我这样做时,会给出这样的垃圾值:
Received GPS Data:
Latitude: -7.52498021739106e-199
Longitude: 3.85e-322
write complete
如果我将
long double
更改为 double
,则工作正常,但我是否必须使用 long double
类型的结构。
现在我浏览了数字Python结构文档,发现没有直接的方法可以做到这一点,所以有没有办法解压这种类型的数据。
在Python中,struct模块不直接支持解包16位浮点数(即长双精度)。但是,您可以使用其他方法解决此问题。
一种方法是手动解析字节并将其转换为适当的数据类型。长双精度通常占用 80 位,因此您需要根据该大小来解析字节。它涉及一些编码工作,但它是可以实现的。
另一种方法是考虑使用其他库或工具来处理此类数据。例如,您可能会考虑使用 NumPy 库,它提供更灵活的数据类型和操作,可能支持您需要的 16 位浮点数。
最后,您还可以考虑先将数据转换为 C++ 代码,然后再以更适合 Python 处理的格式发送数据。这可能需要更改数据发送方式,但它可以简化 Python 中的解包过程。