QByteArray官方帮助文档-详细介绍部分(个人翻译)

QByteArray用来存储元字节(包含'\0')和传统的以'\0'结尾的8位字符串。QByteArray比直接用const char*好得多。QByteArray在后台,能确保数据之后始终跟随着'\0'终止符,并用隐式共享(copy-
on-write)减少内存使用和避免不必要的数据拷贝。


此外,QByteArray可供QString存储字符串数据。通常,你多用QString。QString存储的是Unicode(16bit)字符,你可在应中,自由地存储非ASCII和非-Latin-1字符。并且,QString贯穿于整个Qt API。若
你需存储原始二进制数据或系统(例:嵌入式linux版Qt)内存保护高,QByteArray更合适。

给构造函数传一个const char*即可初始化QByteArray。
例如:以下代码创建了1个大小为5的字节数组,内含数据"Hello":
QByteArray ba("Hello"); 

QByteArray在字节数组尾自动添加了'\0'终止符,size()返回值是5。
当外部请求原始数据时,QByteArray返回一个以'\0'终止符结尾底层数据指针。

使用const char*初始化,QByteArray将做深拷贝,因此你可随意编辑它,无需担心会引起任何其他影响。(如你想提高性能,不想要深拷贝,用QByteArray::fromRawData())。


初始化QByteArray的另一个方法是,先用resize()设置数组大小,之后再一个一个地初始化每个字节。与C++索引一样,QByteArr位y使用0基索引,用运算符[]指定索引,可访问对应数据。对非常量字节数
组non-const byte array,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 << "找出[a-f]" << endl;
  }

at()不做深拷贝,比运算符[]()运行更快。

若需一次提取多个字节,用left()、right()、或mid()。
QbyteArray能存放'\0'。对于内存'\0'的QByteArray,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.

如果你想知道字节数组中第一个'\0'前有几个字符,用qstrlen()。
resize()调用后,新申请的内存为初始化,内含未定义值。用fill()将所有字节初始化为指定值。

data()或constData()都能返回一个指向原始字节数组头的指针。只要不调用non-const函数,该指针将一直有效。除了由原始数据(raw data)创建QByteArray外,QByteArray确保该指针指向的字节数组末
尾有'\0'终止符。由QByteArray自动添加的'\0'不计入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()前两个参数分别是擦写起始位置和擦写字节数量。
当向非空non-empty数组append()数据时,array将重新分配内存,并将新数据拷贝给他。若你要规避该类操作,可用reserve。reserve能预分配指定长度的内存。用capacity能查明QByteArray实际被分配
了多少内存。若将数据添加到空字节数组,不会发生拷贝。

从字节数组中删除空白字符('\n','\t'等)是一个高频需求。若你要删除QByteArray两端的空白字符,使用trimmed()。若你不仅要删除QByteArray两端的空白字符,并想将QByteArray内的多个连续空白
字符替换为一个简单的空白字符,用simplified()。

若你想从QByteArray中找出所有的特定字符或子字符串,使用indexOf()或lastIndexOf()。former从指定索引位置向前搜索,latter向后搜索,发现指定字符或子字符串返回对应索引,其他情况,都返
回-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;
  }


若你仅想知道,QByteArray是否含有特定字符或子符串,用contains()。若你想找出在字节数组中,特定字符或子符串有多少个,用count()。如果你想用另一个内容替代所有的特定字符或子符串,用
replace()
QByteArrays可用重载的操作符进行比较,例如<(), <=(), ==(), >=()等。比较基于字节数组内字符的数值,速度非常快,但这不是大家想要的。QString::localeAwareCompare()是一个用户自定义比较接
口,更好用。

历史原因,对单null字节数组和空字节数组,QByteArray是区别待遇的。
单null字节数组由QByteArray的默认构造函数或给构造函数传(const char*)0产生的。
空字节数组size()返回值为0的任何字节数组。
单null字节数组肯定是空字节数组,但是空字节数组不一定是单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'的字节数组,data()可返回一个有效的指针,与QByteArray("")比较,是相等的。所有,我们建议你尽管避免使用
isNull(),始终用isEmpty()。


最大尺寸和内存不足条件
当前版本的QByteArray大小限制在2GB(2^31 Byte)下。为满足数据块管理需求,该值是architecture-dependent。
原数据块在本版本中,限制在2GB,最小1字节。

若内存分配失败,QByteArray将抛出std::bad_alloc异常。Qt容器中,只有不满足内存条件,才会抛出异常。

注意:操作系统会对申请大内存的应用施加更多的限制,特别是大的、连续的数据块。操作系统对大内存的关注,该类操作的配置以及超出了QByteArray API范围了。
注意:

数字字符串转换


数字与字符串之间的转换操作基于本地C,与用户的本地设置无关。使用QString执行数字与字符串操作,使用本地转换,

8-bit字符比较
在QByteArray中,字符基于Latin-1。如果两方字符串只含有Latin-1字符,大小写区分、比较才是准确的。contain(),indexOf(),lastIndexof(),<(),<=(),>(),>=(),siLower(),isUpper(),toLower()和
toUpper()都受此影响。


本问题不适用于QString相关,因为他们使用Unicode表示字符。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章