QByteArray类

匿名 (未验证) 提交于 2019-12-03 00:32:02

QByteArray类

提供一个字节数组,QByteArray可用于存储原始字节(包括“\ 0” )和传统的8位 “\ 0” 端接字符串 . 使用QByteArray比使用const char *更方便.


QByteArray适合的两个主要情况是当您需要存储原始二进制数据,并且当内存保护至关重要时(例如,使用嵌入式Linux的Qt)


其中包含数据“Hello”:

            QByteArray ba("Hello");
  • 1


以便如果使用一个函数来请求指向底层数据的指针(例如调用data()),那么指出的数据保证被’\ 0’终止。

另一种方法是使用resize()设置数组的大小,并初始化每个字节的数据字节.


返回一个可以在赋值左侧使用的字节的引用。例如:

            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;              }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

at()可以比operator []()更快,因为它不会导致深层拷贝发生。

要一次提取多个字节,请使用 left(),right() 或mid()。

QByteArray可以嵌入“\0” 字节,size()函数总是返回整个数组的大小,包括嵌入的’\ 0’字节,但不包括QByteArray添加的终止’\ 0’.比如:

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

调用resize()后,新分配的字节具有未定义的值。 要将所有字节设置为特定值,请调用fill()。


指针保持有效,直到在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" 替代
  • 1
  • 2
  • 3
  • 4

这个 replace() 和remove()函数,前两个参数是从其开始擦除的位置和应该被擦除的字节数。


如果要从两端移除空格并用字符数组中的单个空格替换多个连续的空格,请使用simplified()。



如果它们找到它; 否则返回-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; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7



如果要将特定值的所有出现替换为另一个,请使用两个参数replace()重载之一。

可以使用运算符<(),运算符<=(),运算符==(),运算符>=()等重载运算符来比较QByteArray。比较完全基于字符的数值,非常快,但不是我们期望的。QString :: localeAwareCompare()是排序用户界面字符串的更好选择。

由于历史原因,QByteArray区分了一个Null byte 和 empty bytenull字节数组初始化是一个字节数组,使用QByteArray的默认构造函数或通过构造函数(const char *)0。一个空的任何字节数组大小为0字节数组。一个null字节数组总是空的,但是空字节数组不一定是零:

  QByteArray().isNull();          // returns true   QByteArray().isEmpty();         // returns true    QByteArray("").isNull();        // returns false   QByteArray("").isEmpty();       // returns true    QByteArray("abc").isNull();     // returns false   QByteArray("abc").isEmpty();    // returns false

所有功能除了isNull()把null字节数组一样空字节数组。例如,数据()返回一个指针指向一个' \ 0 '字符为空字节数组(不是一个空指针),和QByteArray()比较等于QByteArray(" ")。我们建议您始终使用isEmpty()和避免isNull()。

成员函数:

(1).char *QByteArray::data()

QByteArray ba("Hello world"); char *data = ba.data();//返回一个指向字节数组ba的数据指针,指向第一个字符 qDebug() << ba.data();//打印整个字符 while (*data) {     cout << "[" << *data << "]" << endl;     ++data; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

得到结果 [ 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"
  • 1
  • 2
  • 3
  • 4
  • 5

(3). int QByteArray::indexOf(const QByteArray &ba, int from = 0) const

返回该字节数组中第一次出现字节数组ba的索引位置,从索引位置向前搜索。如果找不到ba,则返回-1 。

eg:

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(4). bool QByteArray::isEmpty() const

如果字节数组的大小为0,返回true; 否则返回false。

(5). QByteArray QByteArray::left(int len) const


eg:

QByteArray x("Pineapple");  QByteArray y = x.left(4); // y == "Pine"
  • 1
  • 2

(6). QByteArray QByteArray::number(int n, int base = 10)


eg:

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

可以理解为 int 类型到QByteArray类型的转化。

(7). QByteArray &QByteArray::setNum(int n, int base = 10)

将字节数组设置为基数为n的打印值(默认为10)并返回对字节数组的引用。基数可以是介于2和36之间的任何值。对于非10以外的其他值,n被视为无符号整数。

eg:

QByteArray ba; int n = 63; ba.setNum(n);           // ba == "63" ba.setNum(n, 16);       // ba == "3f" 
  • 1
  • 2
  • 3
  • 4
  • 5

(8). int QByteArray::size() const


eg:

    QByteArray ba("Hello");      int n = ba.size();          // n == 5      ba.data()[0];               // returns 'H'  操作某一位的方法   ba.data()[4];               // returns 'o'     ba.data()[5];               // returns '\0'
  • 1
  • 2
  • 3
  • 4
  • 5

(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值的字节数组。

eg:

QByteArray string("1234.56"); double a = string.toDouble();   // a == 1234.56
  • 1
  • 2

(10). QByteArray QByteArray::toHex() const


See also fromHex().

(11). std::string QByteArray::toStdString() const

返回std :: string对象,带有QByteArray中包含的数据的.


文章来源: QByteArray类
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!