reinterpret_cast - double to char[] to double not working -
reinterpret_cast - double to char[] to double not working - C++
我正试图通过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);
- "error: no matching function for call to"构造函数错误
- vector<vector<double>> to mxArray using memcpy
- 使用词法强制转换在'string to double'中设置双精度变量的精度
- "Cannot convert parameter 1 from double to float"虽然没有更改参数
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- C++ 错误"undefined reference to GPScoord::(double,double) etc."
- Converting Eigen::SparseMatrix<double> to deal.ii ::Sp
- Casting from (long)double to size_t
- 我越来越"invalid conversion from `void*` to `std::complex<double>*"
- 了解错误"error: cannot convert ‘char**’ to ‘const char*’ for argument ‘1’ to ‘double atof(const char*)’"
- 在函数 c/c++ 中传递指针时出错"double** to double*"
- 将 double 分配给 const int&vs int to const int&
- C++ winapi LONG to std double
- 编译程序时出错C++:"error: cast from ‘double*’ to ‘int’ loses precision"
- 为什么此代码显示"cannot convert 'double' to 'double*'"错误?
- C++ MFC double to CString
- Round Double and Cast to String
- Double to Const Char*
- reinterpret_cast - double to char[] to double not working -
- How to #define call(Double X) to func2(double X)