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

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

本文关键字:double to not working char reinterpret cast      更新时间:2023-10-16

我正试图通过udpSendSocket在数据报中发送一些double。数据来自QT GUI,并发送到VS2013驱动程序(均为C++)。我使用QDataStream将数据放入QByteArray中,然后将其发送出去。对于整数,一切都很好,但我无法使其适用于双打。

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

起初,我直接向声称使用IEEE 754的QDataStream发送了一个double,然后使用*interpret_cast将其转换回double。

// 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(double)返回8。

我在使用relpret_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

实时演示

@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());

在您的interpret_cast示例中,您使用指向bytes的指针,该指针已经是指向数据字节的指针,并将指针转换为双精度指针。如果改为强制转换bytes并同时强制转换为const double*(因为reinterpret_cast不会消除constness),它将起作用:

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