在 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);
我的程序目前发送和接收 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);