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

时间:2015-06-24 15:52:27

标签: c++ qt casting udp reinterpret-cast

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

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

起初我直接向QDataStream发送了一个声明使用IEEE 754然后使用* 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(double)返回8.

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

由于

3 个答案:

答案 0 :(得分:3)

您不希望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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

在你的interpret_cast示例中,您将指向bytes的指针,该指针已经是指向数据字节的指针并且转换为指向double的指针。如果您转换bytes而转换为const double*(因为reinterpret_cast不会丢弃const),它将起作用:

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