1、QByteArray类
提供一个字节数组,QByteArray可用于存储原始字节(包括“\ 0” )和传统的8位 “\ 0” 端接字符串。使用QByteArray比使用const char 更方便。除了QByteArray之外,Qt还提供了QString类来存储字符串数据。对于大多数用途,QString是您要使用的类。它存储16位Unicode字符,使您可以轻松地在应用程序中存储非ASCII /非拉丁字符。此外,QSt API在Qt API中始终使用。
QByteArray适合的两个主要情况是当您需要存储原始二进制数据,并且当内存保护至关重要时(例如,使用嵌入式Linux的Qt)
初始化QByteArray的一种方法是const char *将其传递给其构造函数。例如,以下代码创建一个大小为5的字节数组,
其中包含数据“Hello”:
QByteArray ba("Hello");
虽然size()为5,但是字节数组在最后还会保留一个额外的’\ 0’字符,
以便如果使用一个函数来请求指向底层数据的指针(例如调用data()),那么指出的数据保证被’\ 0’终止。
另一种方法是使用resize()设置数组的大小,并初始化每个字节的数据字节。
QByteArray使用基于0的索引,就像C ++数组一样。 要访问特定索引位置的字节,可以使用operator[] ()在非 常量字节数组上,operator 返回一个可以在赋值左侧使用的字节的引用。例如:
QByteArray ba;
ba.resize(5);
ba[0] = 0x3c;
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;
//对于只读访问,替代语法是使用at():
for (int i = 0; i < ba.size(); ++i)
{
if (ba.at(i) >= 'a' && ba.at(i) <= 'f')
cout << "Found character in range [a-f]" << endl;
}
at()可以比operator []()更快,因为它不会导致深层拷贝发生。
要一次提取多个字节,请使用 left(),right() 或mid()。
QByteArray可以嵌入“\0” 字节,size()函数总是返回整个数组的大小,包括嵌入的’\ 0’字节,但不包括QByteArray添加的终止’\ 0’。
调用resize()后,新分配的字节具有未定义的值。 要将所有字节设置为特定值,请调用fill()。
要获取指向实际字符数据的指针,请调用data()或constData()。这些函数返回一个指向数据开头的指针。
指针保持有效,直到在QByteArray上调用了非const函数。除了从原始数据创建QByteArray之外,还保证数据以”\ 0”字节结尾。这个’\ 0’字节由QByteArray自动提供,并不会在size()中计算。
QByteArray类提供以下用于修改字节数据的基本功能:append(),prepend() ,insert(),replace()和remove()。
QByteArray x("and");
x.prepend("rock "); // x == "rock and" 前置
x.append(" roll"); // x == "rock and roll" 附加
x.replace(5, 3, "&"); // x == "rock & roll" 替代
这个 replace() 和remove()函数,前两个参数是从其开始擦除的位置和应该被擦除的字节数。
一个常见的要求是从字节数组(’\ n’,’\ t’,’等)中删除空白字符,如果要从QByteArray两端删除空格,请使用trimmed()。
如果要从两端移除空格并用字符数组中的单个空格替换多个连续的空格,请使用simplified()。
如果要查找QByteArray中特定字符或子字符串的所有出现,请使用indexOf()或lastIndexOf()。
indexOf()从给定的索引位置开始搜索,lastIndexOf()向后搜索。两者返回字符或子字符串的索引位置,
如果它们找到它; 否则返回-1 。例如,这是一个典型的循环,它查找特定子字符串的所有出现:
QByteArray ba("We must be bold, very bold");
int j = 0;
while ((j = ba.indexOf("", j)) != -1)
{
cout << "Found tag at index position " << j << endl;
++j;
}
如果您只想检查QByteArray是否包含特定字符或子字符串,请使用contains()。
如果要查找字节数组中特定字符或子字符串的次数,请使用count()。
如果要将特定值的所有出现替换为另一个,请使用两个参数replace()重载之一。
可以使用运算符<(),运算符<=(),运算符==(),运算符>=()等重载运算符来比较QByteArray。比较完全基于字符的数值,非常快,但不是我们期望的。QString :: localeAwareCompare()是排序用户界面字符串的更好选择。
由于历史原因,QByteArray区分了一个Null byte 和 empty byte. 我们建议您始终使用isEmpty().
成员函数:
(1).char *QByteArray::data()
返回指向字节数组中存储的数据的指针。该指针可用于访问和修改组成数组的字节。具体访问字节数组中的某一个,采用ba.data()[0]–>访问第0个
QByteArray ba("Hello world");
char *data = ba.data();//返回一个指向字节数组ba的数据指针,指向第一个字符
qDebug() << ba.data();//打印整个字符
while (*data)
{
cout << "[" << *data << "]" << endl;
++data;
}
得到结果 [ H ] ,[ e ] ,[ l ] ,[ l ] ,[ o ], [ ], [ w ] ,[ r ] ,[ l ] ,[ d ].
(2). QByteArray &QByteArray::fill(char ch, int size = -1)
将字节数组中的每个字节设置为字符ch。如果size与-1(默认值)不同,则字节数组将预先调整为大小。
QByteArray ba("Istambul");
ba.fill('o');
// ba == "oooooooo"
ba.fill('X', 2);
// ba == "XX"
(3). int QByteArray::indexOf(const QByteArray &ba, int from = 0) const
返回该字节数组中第一次出现字节数组ba的索引位置,从索引位置向前搜索。如果找不到ba,则返回-1 。
QByteArray x("sticky question");
QByteArray y("sti");
x.indexOf(y); // returns 0
x.indexOf(y, 1); // returns 10
x.indexOf(y, 10); // returns 10
x.indexOf(y, 11); // returns -1
(4). bool QByteArray::isEmpty() const
如果字节数组的大小为0,返回true; 否则返回false。
(5). QByteArray QByteArray::left(int len) const
返回一个包含该字节数组最左侧len个字节的字节数组,如果len大于size(),则返回整个字节数组.
QByteArray x("Pineapple");
QByteArray y = x.left(4); // y == "Pine"
(6). QByteArray QByteArray::number(int n, int base = 10)
返回一个字节数组,其中包含等价于数字n到基数的字符串(默认为10)。基数可以是2到36之间的任何值。
eg:
int n = 63;
QByteArray::number(n); // returns "63"
QByteArray::number(n, 16); // returns "3f"
QByteArray::number(n, 16).toUpper(); // returns "3F"
可以理解为 int 类型到QByteArray类型的转化。
(7). QByteArray &QByteArray::setNum(int n, int base = 10)
将字节数组设置为基数为n的打印值(默认为10)并返回对字节数组的引用。基数可以是介于2和36之间的任何值。对于非10以外的其他值,n被视为无符号整数。
QByteArray ba;
int n = 63;
ba.setNum(n); // ba == "63"
ba.setNum(n, 16); // ba == "3f"
(8). int QByteArray::size() const
返回此字节数组中的字节数。
QByteArray ba("Hello");
int n = ba.size(); // n == 5
ba.data()[0]; // returns 'H' 操作某一位的方法
ba.data()[4]; // returns 'o'
ba.data()[5]; // returns '\0'
(9)double QByteArray::toDouble(bool *ok = Q_NULLPTR) const
float QByteArray::toFloat(bool *ok = Q_NULLPTR) const
int QByteArray::toInt(bool *ok = Q_NULLPTR, int base = 10) const
返回转换为double值的字节数组。
QByteArray string("1234.56");
double a = string.toDouble(); // a == 1234.56
(10). QByteArray QByteArray::toHex() const
返回字节数组的十六进制编码副本。十六进制编码使用数字 0 - 9 和字母 a - f。
See also fromHex().
(11). std::string QByteArray::toStdString() const
返回std :: string对象,带有QByteArray中包含的数据的.
2.QByteArray与char的转换
2.1 QByteArray 转 char
方式1 传统方式data()和size()函数
QByteArray array(10, 'Q');//初始化
//array 赋值等代码
//...
// 转化
char *buf;//只是一个指针
int len;//buf的长度
buf = array.data();
len = array.size();
方式2 memcpy()方式
QByteArray array(9,'Q');
char buf[10];//数组
int len_array = array.size();
int len_buf = sizeof(buf);
int len = qMin( len_array, len_buf );
// 转化
memcpy( buf, array, len );
2.2 char* 转 QByteArray
方法1 利用构造函数
char buf[10];
//给buf赋值
for (int i = 0; i < 10; i++)
{
buf[i] = (i + 1) % 3;//其中存在'\0'元素
}
// 转化
QByteArray array;
array = QByteArray(buf, 10);//因为buf[]中有`\0`,必须要写上数据长度;否则,数据会直接截断,丢失数据
方式2 memcpy()方式
char buf[10];
//给buf赋值
for (int i = 0; i < 10; i++)
{
buf[i] = (i + 1) % 3;//其中存在'\0'元素
}
// 转化
QByteArray array;
array.resize(sizeof(buf));//重置数据大小
memcpy(array.data(), buf, sizeof(buf));//copy数据
3.QByteArray与int 以及int[] 的转换
3.1. int 与 QByteArray 互转
1)int 转 QByteArray
// int 转 QByteArray
int intVar = 199;
QByteArray array;
int len_intVar = sizeof(intVar);
array.resize(len_intVar);
memcpy(array.data(), &intVar, len_intVar);
2)QByteArray 转 int
// QByteArray 转 int
// array 数据接上面
int outIntVar;
memcpy(&outIntVar, array.data(), len_intVar);
//memcpy(&outIntVar, array, len_intVar);//此行代码与上句通用
3.2. int[] 与 QByteArray 互转
1) int[] 转 QByteArray
// int[] 转 QByteArray
// int[] 转 QByteArray
int intVar[4] = {1,2,9,0};//初始化变量赋值
QByteArray array;
int len_intVar = sizeof(intVar);
array.resize(len_intVar);
//转换 int[] -> QByteArray
memcpy(array.data(), &intVar, len_intVar);
2)QByteArray 转 int[]
// QByteArray 转 int[]
// array 数据接上面
int outIntVar[4];
memcpy(&outIntVar, array.data(), len_intVar);
//memcpy(&outIntVar, array, len_intVar);//此行代码与上句通用
4.QByteArray与float 以及float[] 的转换
其实完全可以参考第3节,int的用法.
4.1. float[] 与 QByteArray 互转
1) float[] 转 QByteArray
// float[] 转 QByteArray
float fVar[4] = { 1.1, 2.3, 9.5, 0.2 };//初始化变量赋值
QByteArray array;
int len_fVar = sizeof(fVar); // 4*4 = 16 (一个float占4个字节)
array.resize(len_intVar);
memcpy(array.data(), &fVar, len_fVar);
2)QByteArray 转 float[]
// QByteArray 转 float[]
float outFvar[4];
memcpy(&outIntVar, array.data(), len_fVar);
//memcpy(&outFvar, array, len_fVar);//此行代码与上句通用
4.2. float 与 QByteArray 互转
可以参考int。