reinterpret_cast - double to char[] to double 不工作 - C++

reinterpret_cast - double to char[] to double not working - C++

我正在尝试通过 udpSendSocket 在数据报中发送一些双精度值。数据来自 QT GUI 并被发送到 VS2013 驱动程序(均使用 C++)。我正在使用 QDataStream 将数据放入 QByteArray,然后将其发送出去。一切都适用于整数,但我不能让它适用于双打。

我已经确认我的传输代码工作正常,因此驱动程序正在接收数据报中的任何内容,因此我正在 QT 程序中进行所有测试。

起初我直接将双精度发送到声称使用 IEEE 754 的 QDataStream,然后使用 *reinterpret_cast 将其转换回双精度。

// QT Program
QByteArray datagram;
QDataStream out(&datagram, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_1);
out.setFloatingPointPrecision(QDataStream::SinglePrecision);

double test = 0.3;
out << test;
double recv = *reinterpret_cast<double*>(&datagram);

有了 recv = 2.32e-317。

在那之后不起作用,我专注于尝试将双精度数组转换回字节数组。多个消息来源让我相信这会奏效,但事实并非如此。

double test = 0.3;
unsigned char const* bytes = reinterpret_cast<unsigned char const*>(&test);
double recv = *reinterpret_cast<double*>(&bytes);

有了 recv = 1.33e-317。

sizeof(双) returns 8.

reinterpret_cast 我做错了什么?我应该以不同的方式进行这种转换吗?有什么建议吗?

谢谢

您不想 reinterpret_cast &bytes,但是 bytes。前者是指针的地址,后者是值(指向的是什么),也就是你的double所在的地方。

此外,转换为 unsigned char*,而不是 unsigned char* const,因此您不会丢弃 c-v 限定符

double test = 0.3;
unsigned char* bytes = reinterpret_cast<unsigned char*>(&test);
double recv = *reinterpret_cast<double*>(bytes);
std::cout << recv << std::endl;

输出:

0.3

Live Demo

在您的 interpret_cast 示例中,您正在获取指向 bytes 的指针,它已经是指向数据字节的指针,并转换为指向双精度的指针。如果你改为转换 bytes 并且还转换为 const double* (因为 reinterpret_cast 不会丢弃常量)它将起作用:

double recv = *reinterpret_cast<const double*>(bytes);

@AndyG 关于 bytes 部分是正确的。至于 datagram&datagram 为您提供 QByteArray 对象的地址,而不是其内容的地址。为此,您需要 data():

QByteArray datagram;
QDataStream out(&datagram, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_1);
out.setFloatingPointPrecision(QDataStream::SinglePrecision);

double test = 0.3;
out << test;
double recv = *reinterpret_cast<double*>(datagram.data());