【QT】QByteArray、QString、char* 的相互转化(文本形式、二进制、十六进制)

目录

  • 1. QByteArray 与 QString 的相互转化
    • 1.1 QByteArray文本形式的转化
      • 1.1.1 QByteArray 转 QString
      • 1.1.2 QString 转 QByteArray
    • 1.2 QByteArray非文本形式的转化(二进制、十六进制)
      • 1.2.1 QByteArray 转 QString
      • 1.2.2 QString 转 QByteArray
  • 2. QByteArray 与 char * 的相互转化
    • 2.1 QByteArray 转化为 char *
    • 2.1 char * 转化为 QByteArray
  • 3. QString 与 char * 的相互转化
    • 3.1 QString 转化为 char *
      • 3.1.1 先转化为 QByteArray,再转化为 char *
      • 3.1.2 先转为标准库中的 string 类型,再转化为 char *
    • 3.2 char * 转化为 QString

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();
  1. toLatin1:ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF
  2. toLocal8Bit:gb18030字符集兼容了gbk字符集,以两个字节表示一个文字。windows系统可能使用的就是这两种的一种
  3. 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"

你可能感兴趣的:(怎样学好QT,qt,QByteArray,QString,char,c++)