1. QByteArray 与 QString 的相互转化
1.1 QByteArray文本形式的转化
1.1.1 QByteArray 转 QString
QByteArray byte = "ccc";
QString str = QString(byte); //直接使用QString构造
1.1.2 QString 转 QByteArray
QString str = "aaa";
QByteArray byte = str.toLatin1();
QByteArray byte = toLocal8Bit();
QByteArray byte = toUtf8();
- toLatin1:ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF
- toLocal8Bit:gb18030字符集兼容了gbk字符集,以两个字节表示一个文字。windows系统可能使用的就是这两种的一种
- toUtf8:utf8字符集以2个或以上的字节表示一个汉字。实际上具体的数值和unicode有很大的相关
1.2 QByteArray非文本形式的转化(二进制、十六进制)
QString只有在数据是文本的时候才能构造,对于非文本形式(二进制或十六进制)的数据不能直接构造
1.2.1 QByteArray 转 QString
新建一个记事本命名为1.txt,并在里面随便写入数据,使用ZIP进行压缩为1.zip,zip压缩文件是16进制的数据格式。
QFile file("C:\\Users\\WL\\Desktop\\1.zip"); //压缩文件的路径,路径的\要使用\\进行转义,或者使用/
//QFile file("C:/Users/WL/Desktop/1.zip")
if(!file.open(QIODevice::ReadOnly)){
qDebug() << "打开文件失败";
return; //只读打开文件失败则返回
}
QByteArray byte = file.readAll(); //读取数据
//QString str = QString(byte); //错误,16进制的数据不能直接使用QString构造,否则输出为空
//以下六种方法任意一种都可以
//先使用toHex() 或者 toBase64()
//再使用fromLatin1 或 fromLocal8Bit 或 fromUtf8 转化为QString
QString str1 = QString::fromLatin1(byte.toHex());
QString str2 = QString::fromLatin1(byte.toBase64());
QString str3 = QString::fromLocal8Bit(byte.toHex());
QString str4 = QString::fromLocal8Bit(byte.toBase64());
QString str5 = QString::fromUtf8(byte.toHex());
QString str6 = QString::fromUtf8(byte.toBase64());
1.2.2 QString 转 QByteArray
//针对上面6个QString的str1,str2,str3,str4,str5,str6 转化为 QByteArray
QByteArray byte1 = QByteArray::fromHex(str1.toLatin1);
QByteArray byte2 = QByteArray::fromBase64(str2.toLatin1);
QByteArray byte3= QByteArray::fromHex(str3.toLocal8Bit);
QByteArray byte4 = QByteArray::fromBase64(str4.toLocal8Bit);
QByteArray byte5 = QByteArray::fromHex(str5.toUtf8);
QByteArray byte6 = QByteArray::fromBase64(str6.toUtf8);
2. QByteArray 与 char * 的相互转化
2.1 QByteArray 转化为 char *
char *QByteArray::data()
data()返回一个指针,指向存储在字节数组中的数据。指针可用于访问和修改组成数组的字节。
数据以“\0”结束,即对于“\0”结束符,返回字符串中的字节数为size() + 1
。
//QByteArray 转化为 char *
QByteArray ba("Hello world");
char *ch = ba.data(); //ch是指针
qDebug() << *ch; //*ch指向字符'H',输出:H
qDebug() << ch; //输出:Hello world
有人会问,ch不是指针变量吗?但是为什么打印的不是地址?
答:是的,ch肯定是指针变量,它也一定是地址。但是qDebug()是以将要输出的字符串当做参数传入到函数。
在C语言中,系统都会默认在字符串末给我们加上\0用于结束字符串,所以在打印输出时候,只要你打印格式是%s,系统知道我们要输出字符串,而且系统也可以确定字符串的长度,所以当你用%s打印字符指针p的时候就会输出字符串,如果你是以地址打印格式输出的话,系统就会给我们打印出地址, 如果你是解指针(*p),那么系统就取p指针指向的内容,此时看你自己以什么格式输出,就用什么格式打印。
2.1 char * 转化为 QByteArray
char *ch = "Hello world";
QByteArray ba = QByteArray(ch); //直接使用QByteArray()构造
qDebug() << ba; //输出:"Hello world"
qDebug().noquote() << ba; //去除字符串的双引号打印,输出:Hello world
3. QString 与 char * 的相互转化
3.1 QString 转化为 char *
3.1.1 先转化为 QByteArray,再转化为 char *
QString str("Hello world");
//先转化为QByteArray,再转化为char *
char* ch = str.toLatin1().data();
//char* ch = str.toLocal8Bit().data();
//char* ch = str.toUtf8().data();
qDebug() << ch; //输出:Hello world
3.1.2 先转为标准库中的 string 类型,再转化为 char *
注意:c_str()返回的是const
QString str("Hello world");
std::string s = str.toStdString().c_str();
const char* ch = s.c_str();
qDebug() << ch; //输出:Hello world
3.2 char * 转化为 QString
char *ch = "Hello world";
QString str(ch); //直接使用QString()构造
qDebug() << str; //输出:"Hello world"