无损转换 std::string 和 QByteArray 的正确方法

Correct way to losslessly convert to and from std::string and QByteArray(无损转换 std::string 和 QByteArray 的正确方法)
本文介绍了无损转换 std::string 和 QByteArray 的正确方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

什么是在 std::string 和 QByteArray 之间无损转换的正确方法...主要是为了处理二进制数据?

What is the correct way to convert losslessly between std::string and QByteArray... mostly for the purpose of handling binary data?

我正在使用:

QByteArray qba = QString::fromStdString(stdString).toAscii();

QString(qba).toStdString();

但我想检查一下这是否真的正确.

but I wanted to check whether this is actually correct.

推荐答案

对于二进制数据,您的解决方案是有问题的,因为非 ASCII 字符会被 QString:: 转换为 '?'toAscii().对于 QString 的内部表示,还有不必要的 UTF-16 转换开销.正如您可能已经猜到的那样,QString 仅应在数据是文本而非二进制数据时使用.

For binary data your solution is problematic since non-ASCII characters would be converted to '?' by QString::toAscii(). There is also the unnecessary overhead of UTF-16 conversion for the internal representation of QString. As you might have guessed, QString should only be used if the data is textual, not binary.

QByteArraystd::string 都有原始数据(C 字符串 + 长度)的构造函数,也有转换为 C 字符串 + 长度的构造函数.因此您可以使用它们进行转换:

Both QByteArray and std::string have constructors for raw data (C-string + length) and also a conversion to C-string + length. So you can use them for conversion:

// std::string => QByteArray
QByteArray byteArray(stdString.c_str(), stdString.length());

// QByteArray => std::string
std::string stdString(byteArray.constData(), byteArray.length());

它们都是二进制安全的,这意味着字符串可能包含 '' 字符并且不会被截断.数据也不会被触及(没有 UTF 转换),所以这种转换是无损"的.

They are both binary-safe, meaning that the string may contain '' characters and doesn't get truncated. The data also doesn't get touched (there is no UTF conversion), so this conversion is "lossless".

确保使用长度作为第二个参数的构造函数(对于 QByteArraystd::string),因为大多数其他构造函数会在之前截断数据第一次出现零.

Make sure to use the constructors with the length as the second argument (for both QByteArray and std::string), as most other constructors will truncate the data before the first occurrence of a zero.

这篇关于无损转换 std::string 和 QByteArray 的正确方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Rising edge interrupt triggering multiple times on STM32 Nucleo(在STM32 Nucleo上多次触发上升沿中断)
How to use va_list correctly in a sequence of wrapper functions calls?(如何在一系列包装函数调用中正确使用 va_list?)
OpenGL Perspective Projection Clipping Polygon with Vertex Outside Frustum = Wrong texture mapping?(OpenGL透视投影裁剪多边形,顶点在视锥外=错误的纹理映射?)
How does one properly deserialize a byte array back into an object in C++?(如何正确地将字节数组反序列化回 C++ 中的对象?)
What free tiniest flash file system could you advice for embedded system?(您可以为嵌入式系统推荐什么免费的最小闪存文件系统?)
Volatile member variables vs. volatile object?(易失性成员变量与易失性对象?)