序列化双精度以通过 UDP(ARM 到 x86)传输



我正在尝试在某些C++(QT(代码中序列化双精度(在ARM上(并通过UDP将其发送到x86。这两款设备都是Little Endian,都运行Linux。我的问题是,假设两者都使用IEEE-754是否安全?

我最初的尝试似乎没有奏效。我做了以下操作并通过数据报发送。

void QSendDouble::Send()
{
// Start value is 19.231, value increments by 1 each second
dblval = dblval + 1.0;
QByteArray packet;
packet.append('xAA'); // Start Marker
packet.append('xAA'); // Start Marker
QByteArray data(reinterpret_cast<const char*>(&dblval), sizeof(dblval));
packet.append(data);
packet.append('xFF'); // End Marker
packet.append('xFF'); // End Marker
udpsocket->writeDatagram(packet.constData(), QHostAddress::LocalHost, 7711);
}

我的信念是我做了一些错误的假设。

QT 用于发送编码为字节数组的 Double,Python 用于接收 x86 端的字节。

我更新了问题并使用 xxd 和 netcat 观察到以下数据:

%> NC -L -u -P 2488 | xxd -u -cols 12

00000000: AAAA 4260 E5D0 223B 3440 FFFF  ..B`..";4@..
0000000c: AAAA 4260 E5D0 223B 3540 FFFF  ..B`..";5@..
00000018: AAAA 4260 E5D0 223B 3640 FFFF  ..B`..";6@..
00000024: AAAA 4260 E5D0 223B 3740 FFFF  ..B`..";7@..
00000030: AAAA 4260 E5D0 223B 3840 FFFF  ..B`..";8@..
0000003c: AAAA 4260 E5D0 223B 3940 FFFF  ..B`..";9@..
00000048: AAAA 4260 E5D0 223B 3A40 FFFF  ..B`..";:@..
00000054: AAAA 4260 E5D0 223B 3B40 FFFF  ..B`..";;@..

我使用Christopher Vickery的IEEE 754 Analyzer(https://babbage.cs.qc.cuny.edu/IEEE-754/(来查看这些值。查看它产生的第一个值,结果为:

Decimal value: 2.023100000000000164845914696343243122100830078125E1
Normalized binary value: 1.010000111011001000101101000011100101011000000100001b4

这就是我所期望的。是的,正如我所期望的那样,这些值是小字节序,并且它们正在正确传输。

所以罪魁祸首是我最初用来检查数据的工具(我可以排除故障(。

最新更新