在 C/C++ 中分解 UDP 传输中的双精度数字

breaking up double precision numbers in UDP transfer in C/C++

我的程序目前发送和接收 UDP 数据包,并在接收到它们时将它们分解为 16 位块,以便处理传入数据。传入数据的一部分是两个双精度数字(在我的机器上是 64 位)。如何将 16 位块重新组合为双精度格式?它们以那种格式发送给我,但我发现我无法通过 OR 运算、移位等方式重新组合,但我一次只能接收 16 位。有什么想法吗?

所以我收到的传入数据包将有一个 64 位双精度数,但一次读取 16 位:0x9080 0x1145 0x42AF 0x45F3 - 我需要 assemble 将它们恢复为双精度数。

这是我目前尝试过的: "in_data" 是指向我传入的 UDP 数据包的 16 位指针...

        double cal1 = 0;
        double cal2 = 0;

        for (int i = 0; i < 4; i++)     
        {
            in_data++;
            cal1 |= *in_data;
            if (i < 3) cal1 << 16;
        }

        for (int i = 0; i < 4; i++) 
        {
            in_data++;  
            cal2 |= *in_data;
            if (i < 3) cal2 << 16;
        }

我知道这个代码是不正确的,但我在学习之前必须尝试它。

使用 union 或 reinterpret_cast,填充 16 位数组并用作 double:

union U
{
  double d;
  short i[4];
};

如果您只是接收原始位,请将它们存储在 unsigned long long 类型中。

unsigned long long bits;
bits |= packet1;
bits |= packet2 << 16;
bits |= packet3 << 32;
bits |= packet4 << 48;

然后当您需要将其解析为双精度值时,重新解释这些位。

long double input = *((long double*)&bits);