我试图通过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我做错了什么?我应该以不同的方式进行此转换吗?有什么建议吗?
由于
答案 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
答案 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);