天宫鹤

QByteArray通过QDataStream的读写及字符、汉字在QByteArray中的存储

QByteArray dstByteArray;
QDataStream writeToByteArray(&dstByteArray, QIODevice::ReadWrite);
writeToByteArray << QString("中").toUtf8();
// 跳过开头的4个字节,这4个字节表示字符串的长度
qDebug() << "dstByteArray.data() + 4="<<dstByteArray.data() + 4;// 中
qDebug() << "dstByteArray:" << dstByteArray;// "\x00\x00\x00\x03\xE4\xB8\xAD",长度为3(一个汉字由3个UTF-8编码)
qDebug() << "dstByteArray.size():" << dstByteArray.size();// 7=4 + 3
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
writeToByteArray << "中";
// 跳过开头的4个字节,这4个字节表示字符串的长度
qDebug() << "dstByteArray.data() + 4="<<dstByteArray.data() + 4;// 中
qDebug() << "dstByteArray:" << dstByteArray;// "\x00\x00\x00\x04\xE4\xB8\xAD\x00",字符串长度为4(包含自动添加的终止符)
qDebug() << "dstByteArray.size():" << dstByteArray.size();// 8=4 + 3 +1(终止符)

几点结论:

1.在使用QDataStream向一个QByteArray中写入数据时,会首先写入一个32位(4个Byte)的整数,这个整数保存了了此QByteArray的长度('\0'也算一个字符),当从这个QDataStream中读QByteArray中的一个字符串时会首读取这个字符串中一共有多少个字符,也就是开始的那4个Byte,然后再读取字符串的内容。

2.data()会返回指向QByteArray中数据的指针(char *)。

3.QIODevice类在处理数据的时候都有一个文件指针,指向当前处理的位置。当使用 writeToByteArray << QString("test");向一个QByteArray中写入一个字符串后,就像对文件的写入一样,文件的指针会向后移动,指向下一个位置。

4.Qt中QString是以Unicode进行编码的,一个Unicode编码的字符是占两个字节的(16位)。即Qt中一个QString字符占两个字节。

5.Qt中一个汉字由3个UTF-8编码。如”中“:\xE4\xB8\xAD。

6.Qt中的字符串字面量/字符串常量,如:”Hello“,类型为char *,存储在QByteArray 中时,会自动添加终止符‘\0’,QByteArray .size()=10,表示字符串长度的4个字节、自动添加的尾部终止符1个字节。

7.以十六进制显示存储在QByteArray 中的数据,qDebug() << "dstByteArray.toHex(' '):" << dstByteArray.toHex(':');

posted on 2022-08-30 18:09  GoGrid  阅读(760)  评论(0编辑  收藏  举报

导航