【问题标题】:reinterpret_cast - double to char[] to double not working - C++reinterpret_cast - double to char[] to double 不起作用 - C++
【发布时间】:2015-06-24 15:52:26
【问题描述】:

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

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

起初我将一个 double 直接发送到声称使用 IEEE 754 的 QDataStream,然后使用 *reinterpret_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。

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

谢谢

【问题讨论】:

  • 谢谢 AndyG 和 Angew。您的两个回答都非常有帮助。

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


【解决方案1】:

你不想reinterpret_cast&amp;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

【讨论】:

    【解决方案2】:

    @AndyG 关于bytes 部分是正确的。至于datagram&amp;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());
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-17
        • 1970-01-01
        • 2020-10-22
        相关资源
        最近更新 更多