qt -- QByteArray

QByteArray类提供了一个字节数组;QByteArray可用于存储原始字节(包括'\0')和传统的以'\0'结尾的8位字符串。使用QByteArray比使用const char *更方便。

QByteArray常用于串口通讯中。

QByteArray适用的两种主要情况是:当需要存储原始二进制数据时,以及当内存保存非常关键时(例如,对于嵌入式Linux使用Qt)。

1. 初始化

初始化QByteArray的一种方法是简单地将const char *传递给它的构造函数。例如:

QByteArray ba("Hello");

size()是5,字节数组也在末尾保留了一个额外的'\0'字符,以便如果使用的函数要求一个指针到基础数据(例如,对data()的调用),指向的数据保证是'\0'--终止。 

QByteArray对const char *数据进行深度复制,可以在以后修改它,而不会遇到副作用。如果出于性能原因,不想获取字符数据的深度复制,那么可以使用QByteArray::fromRawData()

2. 访问与赋值

使用resize()设置数组的大小,并按字节初始化数据字节。QByteArray使用基于0的索引,就像c++数组一样。要访问特定索引位置的字节,可以使用操作符[]()。对于非const字节数组,操作符[]()返回一个对可在赋值左侧使用的字节的引用。例如:

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'。例如:

  QByteArray ba1("ca\0r\0t");
  ba1.size();                     // Returns 2.
  ba1.constData();                // Returns "ca" with terminating \0.

  QByteArray ba2("ca\0r\0t", 3);
  ba2.size();                     // Returns 3.
  ba2.constData();                // Returns "ca\0" with terminating \0.

  QByteArray ba3("ca\0r\0t", 4);
  ba3.size();                     // Returns 4.
  ba3.constData();                // Returns "ca\0r" with terminating \0.

  const char cart[] = {'c', 'a', '\0', 'r', '\0', 't'};
  QByteArray ba4(QByteArray::fromRawData(cart, 6));
  ba4.size();                     // Returns 6.
  ba4.constData();                // Returns "ca\0r\0t" without terminating \0.

3. 添加、删除、插入与替换操作

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"

4. 数据转换与处理

 从串口读取到的QByteArray数据,一般需要进行提取和解析,此时就需要QByteArray转换为各类型数据。常用转换包括:

1)转为HEX,用于显示十六进制;

Hex编码转换为char存储到QByteArray

[static] QByteArray QByteArray::fromHex(const QByteArray&hexEncoded)

  QByteArray text = QByteArray::fromHex("517420697320677265617421");
  text.data();            // returns "Qt is great!"

QByteArray转为Hex编码: 

QByteArray QByteArray::toHex() const  :

返回字节数组的十六进制编码。十六进制编码使用数字0-9和字母a-f返回字节数组的十六进制编码副本。十六进制编码使用数字0-9和字母a-f。如果分隔符不是'\0',分隔符将插入到十六进制字节之间。

QByteArray QByteArray::toHex(char separator) const

  QByteArray macAddress = QByteArray::fromHex("123456abcdef");
  macAddress.toHex(':'); // returns "12:34:56:ab:cd:ef"
  macAddress.toHex(0);   // returns "123456abcdef"

2)转为不同进制数值并显示,如二进制、八进制、十进制和十六进制等;

[static] QByteArray QByteArray::number(int n, int base = 10)

  int n = 63;
  QByteArray::number(n);              // returns "63"
  QByteArray::number(n, 16);          // returns "3f"
  QByteArray::number(n, 16).toUpper();  // returns "3F"

3)转为整型、浮点型等数值类型;

int QByteArray::toInt(bool *ok = nullptr, int base = 10) const

如果ok不是nullptr,则ok为false设置失败,ok为true则成功。

  QByteArray str("FF");
  bool ok;
  int hex = str.toInt(&ok, 16);     // hex == 255, ok == true
  int dec = str.toInt(&ok, 10);     // dec == 0, ok == false  转为十进制失败

4)大小写转换;

通过toUpper()和toLower()方法实现大小写转换

QByteArray x("Qt by THE QT COMPANY");
QByteArray y = x.toLower();    // y == "qt by the qt company"

QByteArray x("Qt by THE QT COMPANY");
QByteArray y = x.toUpper();    // y == "QT BY THE QT COMPANY"

5)转为字符串类型;

QByteArray byte;
QString str;
str = QString(byte);

 

[static] QByteArray QByteArray::fromBase64(const QByteArray &base64)

返回Base64数组Base64的解码副本。输入不检查有效性;跳过输入中的无效字符,使解码过程可以继续处理后续字符。

QByteArray text = QByteArray::fromBase64("UXQgaXMgZ3JlYXQh");
text.data();            // returns "Qt is great!"

用于解码 Base64 编码数据的算法在 RFC 4648 中定义。

你可能感兴趣的:(#,QT学习笔记,qt)