无法在Python结构中解压16位浮点值

问题描述 投票:0回答:1

我正在尝试解压 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 memory struct unpack
1个回答
0
投票

在Python中,struct模块不直接支持解包16位浮点数(即长双精度)。但是,您可以使用其他方法解决此问题。

一种方法是手动解析字节并将其转换为适当的数据类型。长双精度通常占用 80 位,因此您需要根据该大小来解析字节。它涉及一些编码工作,但它是可以实现的。

另一种方法是考虑使用其他库或工具来处理此类数据。例如,您可能会考虑使用 NumPy 库,它提供更灵活的数据类型和操作,可能支持您需要的 16 位浮点数。

最后,您还可以考虑先将数据转换为 C++ 代码,然后再以更适合 Python 处理的格式发送数据。这可能需要更改数据发送方式,但它可以简化 Python 中的解包过程。

© www.soinside.com 2019 - 2024. All rights reserved.