-1

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

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

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

或者,对于 double 数组:

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

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

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

问候阿洛克

4

2 回答 2

2

如果您只需要将 double 编码和解码为字节数组,则可以使用:

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

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

于 2014-10-15T05:02:46.373 回答
1

假设您要创建人类可读的字符串:

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
于 2014-10-15T05:44:19.373 回答