【Qt】QString,QByteArray, char* 互相转化。

本文主要阐述QString、QByteArray、char*三者之间的互转,或许有多种方式,本文的方式只是其中的一部分。

由于有时需要在控件中显示十六进制数据,则涉及到十六进制数据和字符串之间的转换,故包含 十六进制形式的字符串转为数据,以及 数据转化为十六进制形式字符串

QString、QByteArray、char*三者之间的区别

QString、QByteArray和char*是三种不同的数据类型,每种类型在存储和处理数据上有着特定的区别。

  1. 数据类型:
    • QString是Qt框架提供的用于处理Unicode字符串的类,它以16位(2字节)的方式存储字符。QString适用于处理文本和字符串数据。
    • QByteArray是Qt框架提供的字节数组类,用于存储和处理字节数据。它可以包含任意8位字节,并且提供了一些便捷的方法来操作字节数据和二进制数据。
    • char*是C/C++中用于表示以null结尾的字符数组的指针它以8位(1字节)的方式存储字符。char通常用于处理C风格的字符串。
  2. 存储内容:
    • QString存储的是Unicode字符序列,每个字符使用16位来表示。它适用于多语言文字和Unicode字符的存储和处理。
    • QByteArray存储的是字节数据,可以包含任意8位字节。它适用于存储和处理原始字节序列、二进制数据和网络数据。
    • char*存储的是以null结尾的字符数组,每个字符使用8位来表示。它适用于存储C风格的字符串和与C/C++的交互。
  3. 字符编码:
    • QString内部使用Unicode编码表示字符,支持多种字符编码,并提供了字符编码转换的功能。
    • QByteArray没有默认的字符编码,它主要用于处理字节数据,没有直接支持字符编码的功能。但可以使用QTextCodec类进行字符编码的转换。
    • char*没有内置的字符编码,通常使用的是ASCII编码或者其他用户自定义的编码。字符编码转换可能需要使用外部的库函数。
  4. 接口和功能:
    • QString提供了丰富的接口和方法,以便于处理和操作Unicode字符串,如字符串的查找、替换、大小写转换、分割等。
    • QByteArray提供了一些基本的字节操作接口,如拼接、截取、查找等。此外,它还提供了与文件、网络通信相关的一些功能。
    • char*是一个指针,需要使用C/C++的字符串处理函数来进行操作,如strcpy、strcat、strlen等。在处理过程中需要注意内存管理和防止缓冲区溢出等问题。

综上所述,QString适用于处理Unicode字符串,QByteArray适用于处理字节数据,而char*适用于与C/C++的字符串处理交互,每种类型都有其特定的用途和特点。

QString 至 QByteArray

QString str=QString("No hello, world!");

str.toUtf8();    //函数返回的QByteArray是UTF-8编码的
str.toLatin1();    //函数返回的QByteArray对象采用Latin-1字符集编码。
str.toLocal8Bit();    //函数返回的QByteArray对象采用本地字符集编码。

QString 至 char*

QString str="No hello, world!";

str.toUtf8().data();    //cstr指针指向的字符集为utf-8
str.toLatin1().data();    //cstr指针指向的字符集为Latin-1
str.toLocal8Bit().data();    //cstr指针指向的字符集为本地字符集编码
str.toStdString().data();    //cstr指针指向的字符集是标准ASCII字符集

当转换完成后,cstr指向的内存空间由QString对象内部分配,因此在使用完毕后,无需手动释放空间。但是需要注意,当QString对象的生命周期结束后,cstr指向的内存空间也会被释放,此时再使用cstr指针访问该内存空间会导致未定义的行为。

QByteArray 至 QString

QByteArray byteArray="No hello, world!";

QString str(byteArray);    //使用QString的构造函数将QByteArray转换为QString对象

//以下为静态函数
QString::fromLatin1(byteArray);    //从Latin1字符集编码的QByteArray转化为QString
QString::fromUtf8(byteArray);    //从Utf-8字符集编码的QByteArray转化为QString
QString::fromLocal8Bit(byteArray);    //从本地字符集编码的QByteArray转化为QString

 注意:不同的字符集编码方式可能导致转换结果不同,因此在进行转换时需要明确QByteArray对象中存储的字符集编码方式。

如果不确定QByteArray对象中存储的字符集编码方式,可以使用QTextCodeC进行转换。如下:

QByteArray byteArray = "No hello, world!";
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QString str = codec->toUnicode(byteArray);

 QByteArray 至 char*

QByteArray byteArray = "No hello, world!";
char* ptr = byteArray.data();

注意:QByteArray对象中的数据并不是以null结尾的C字符串,因此在使用该指针时需要确保数据的长度,否则可能会导致访问非法内存

char* 至 QString

const char* cstr="No hello, world!";
cstrLen=16;

QString str(cstr);    //使用QString的构造函数 默认使用UTF-8编码解释输入数据。

QString::fromUtf8(cstr,cstrLen);    //默认将输入数据解释为UTF-8编码
QString::fromLatin1(cstr,cstrLen);    //默认将输入数据解释为Latin1编码
QString::fromLocal8Bit(cstr,cstrLen);    //默认将输入数据解释为本地编码
QString::fromRawData(cstr,cstrLen);    //通常用于创建QString对象,避免在创建QString对象时做不必要的复制工作,从而提高程序的效率。

 注意:在使用该构造函数时,如果字符数组中包含了null字符,那么构造函数会将其作为字符串的结尾而不是中间的字符。如果需要在QString对象中保留null字符,可以使用QString::fromUtf8()QString::fromLatin1()等静态函数进行转换。在使用字符数组时,需要确保其以null结尾,否则在转换为QString对象时可能会引起不可预期的结果。

char* 至 QByteArray

const char* cstr = "Hello, world!";
int length = 14; // 长度包括null字符

QByteArray ba(cstr);    //用QByteArray类的构造函数
QByteArray ba(cstr,length);    //用QByteArray类的构造函数

QByteArray ba = QByteArray::fromRawData(cstr, length); 

QByteArray ba;
memcpy(&ba,cstr,length);

注意:与char*至QString相同,null的问题。

字符串转换为十六进制数据

QString str = "FFAABB";
QByteArray ba = str.toUtf8(); // 将QString转换为QByteArray
QString hex_str = ba.fromHex(ba); // 将QByteArray转换为QString

数据转化为十六进制字符串

QString str = "No hello, world!";
QByteArray ba = str.toUtf8(); // 将QString转换为QByteArray
QString hex_str = ba.toHex(); // 将QByteArray转换为十六进制字符串

你可能感兴趣的:(Qt,qt,c++,开发语言)