QByteArray
字节数组:主要存储8位字符串以及\0
初始化方法
将const char*传递给构造函数
QByteArray ba("Hello");//size为5,但是在最后还会额外添加`\0`resize()设置大小然后初始化每个字节
ba.resize(2); ba[0]=0xAA; ba[1]=0xBB;
常用函数方法
operator[]
at() 只读, at()可以比operator[]更快,因为它不会导致深层拷贝发生
QByteArray ba; ba.resize(5); ba[0] = 0x3c; ba[1] = 0xb8; ba[2] = 0x64; ba[3] = 0x18; ba[4] = 0xca; for(int i=0; i<5; i++) { qDebug("%x",(uint8_t)ba.data()[i]);//data()获取指向实际字符数据的指针 qDebug("%x",(uint8_t)ba[i]; qDebug("%x",(uint8_t)ba.at(i)); } //注意:qDebug这里必须要使用uint8_t强制转换一下append(),prepend() ,insert(),replace(),remove()
trimmed() 删除两端空格
simplified() 从两端移除空格并用字符数组中的单个空格替换多个连续的空格
indexOf() lastIndexOf() 查找QByteArray中特定字符或子字符串的所有出现,indexOf()返回该字节数组中第一次出现字节数组ba的索引位置,从索引位置向前搜索。如果找不到ba,则返回-1 。
QByteArray ba("We must be <b>bold</b>, very <b>bold</b>"); int j = 0; while ((j = ba.indexOf("<b>", j)) != -1) { cout << "Found <b> tag at index position " << j << endl; ++j; }contains() 是否包含特定字符或子字符串
count() 查找字节数组中特定字符或子字符串的次数
isEmpty()
fill()
number(int n, int base = 10) 返回,可以理解为int类型到QByteArray类型的转化(base=10或16,表示进制)
setNum((int n, int base = 10) 设置
toHex() 返回字节数组的十六进制编码副本
toStdString() 返回std::string对象
注意:
- QByteArray可以嵌入
\0字节,size()函数总是返回整个数组的大小,包括嵌入的\0字节,但不包括QByteArray添加的终止\0(用户添加和qt自己添加的’\0’不一样) - QByteArray存入的是char型数据,要注意与unsiged char区别,做字节协议控制的时候注意强制转换
- QByteArray与QString之间的转换
QByteArray cstr("abcd");
QString s = cstr;
QByteArray cstr("abcd");
QString s;
s.prepend(cstr);
QString s("hello");
QByteArray cstr = s.toAscii();
QString s("hello");
QByteArray cstr = s.toLatin1();
QDataStream和QTextStream
QDataStream用于读写二进制数据,它的优点是:在读写数据的时候已经严格定义了数据流的类型和每个类型的长度,这样就不用关心编码之间转换的问题了
QTextStream用于读写文本(如HTML、XML和源代码等)的格式,解决了二进制文件格式无法直接阅读和编辑的缺点。QTextStream考虑了Unicode编码与系统本地编码或其他编码之间的转换问题,并考虑了不同操作系统之间行尾符切换的问题(MS “\r\n”, Mac “ \n”)
QTextStream使用16位的QChar类型作为基本数据单元,并支持数字类型和字符串类型的转换
本文介绍了Qt中的QByteArray数据类型,包括其初始化、常用函数以及与QString的转换。此外,还探讨了QDataStream和QTextStream,QDataStream用于读写二进制数据,而QTextStream则专注于文本格式的读写,考虑了编码转换和行尾符问题。
1034

被折叠的 条评论
为什么被折叠?



