【问题标题】:How to convert double* data to const char* or QByteArray efficiently如何有效地将 double* 数据转换为 const char* 或 QByteArray
【发布时间】:2014-12-10 00:43:46
【问题描述】:

我正在尝试在我的项目中使用 Qt 中的网络编程 API。我的代码的一部分要求我将 double* 数据转换为 QByteArray 或 const char*。

我搜索了 stackoverflow 的问题,发现很多人建议使用此代码:

QByteArray array(reinterpret_cast<const char*>(data), sizeof(double));

或者,对于一个双精度数组:

QByteArray::fromRawData(reinterpret_cast<const char*>(data),s*sizeof(double));

当我在我的函数中使用它们时,它并没有给我想要的结果。输出似乎是随机字符。

请提出一种在 Qt 中实现它的有效方法。非常感谢您的宝贵时间。

问候 阿洛克

【问题讨论】:

  • 您需要什么?这些双精度的二进制表示(您的代码可能存在内存管理问题,如果您需要深拷贝使用QByteArray::QByteArray ( const char * data, int size )),还是需要将其转换为这些值的文本表示(@Silicomancer 回答)?我建议您准确描述您对这些数据所做的工作。

标签: qt reinterpret-cast qbytearray


【解决方案1】:

如果您只需要将双精度数编码和解码为字节数组,则可以:

double value = 3.14159275;
// Encode the value into the byte array
QByteArray byteArray(reinterpret_cast<const char*>(&value), sizeof(double));

// Decode the value
double outValue;
// Copy the data from the byte array into the double
memcpy(&outValue, byteArray.data(), sizeof(double));
printf("%f", outValue);

但是,这不是通过网络发送数据的最佳方式,因为这取决于机器如何编码双精度类型的平台细节。我建议您查看QDataStream 类,它允许您这样做:

double value = 3.14159275;
// Encode the value into the byte array
QByteArray byteArray;
QDataStream stream(&byteArray, QIODevice::WriteOnly);
stream << value;

// Decode the value
double outValue;
QDataStream readStream(&byteArray, QIODevice::ReadOnly);
readStream >> outValue;
printf("%f", outValue);

这现在是独立于平台的,流操作符使它非常方便和易于阅读。

【讨论】:

    【解决方案2】:

    假设你想创建一个人类可读的字符串:

    double d = 3.141459;
    QString s = QString::number(d); // method has options for format and precision, see docs
    

    或者如果您需要本地化,其中 locale 是 QLocale 对象:

    s = locale.toString(d); // method has options for format and precision, see docs
    

    如果确实需要,您可以使用 s.toUtf8() 或 s.toLatin1() 轻松地将字符串转换为 QByteArray。如果速度很重要,还有:

    QByteArray ba = QByteArray::number(d); // method has options for format and precision, see docs
    

    【讨论】:

      猜你喜欢
      • 2015-01-06
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多