如何有效地将double *数据转换为const char *或QByteArray

时间:2014-10-15 03:37:41

标签: qt reinterpret-cast qbytearray

我正在尝试在我的项目中使用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中实施它的有效方法。非常感谢您的宝贵时间。

此致 阿洛克

2 个答案:

答案 0 :(得分: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);

现在这与平台无关,流操作符使其非常方便易读。

答案 1 :(得分:1)

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

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

或者如果您需要本地化是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