本文主要阐述QString、QByteArray、char*三者之间的互转,或许有多种方式,本文的方式只是其中的一部分。
由于有时需要在控件中显示十六进制数据,则涉及到十六进制数据和字符串之间的转换,故包含 十六进制形式的字符串转为数据,以及 数据转化为十六进制形式字符串。
QString、QByteArray和char*是三种不同的数据类型,每种类型在存储和处理数据上有着特定的区别。
综上所述,QString适用于处理Unicode字符串,QByteArray适用于处理字节数据,而char*适用于与C/C++的字符串处理交互,每种类型都有其特定的用途和特点。
QString str=QString("No hello, world!");
str.toUtf8(); //函数返回的QByteArray是UTF-8编码的
str.toLatin1(); //函数返回的QByteArray对象采用Latin-1字符集编码。
str.toLocal8Bit(); //函数返回的QByteArray对象采用本地字符集编码。
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 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 byteArray = "No hello, world!";
char* ptr = byteArray.data();
注意:QByteArray对象中的数据并不是以null结尾的C字符串,因此在使用该指针时需要确保数据的长度,否则可能会导致访问非法内存。
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对象时可能会引起不可预期的结果。
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转换为十六进制字符串