一、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 <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()重载之一。

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

由于历史原因,QByteArray区分了一个Null byte 和 empty byte. 我们建议您始终使用isEmpty().

二、成员函数

函数一: 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 ].

函数二: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"

函数三: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

函数四:bool QByteArray::isEmpty() const
如果字节数组的大小为0,返回true; 否则返回false。

函数五:QByteArray QByteArray::left(int len) const
返回一个包含该字节数组最左侧len个字节的字节数组,如果len大于size(),则返回整个字节数组. 
eg:

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

函数六: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类型的转化。

函数七: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"

函数八: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'

函数九:

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

函数十:QByteArray QByteArray::toHex() const
返回字节数组的十六进制编码副本。十六进制编码使用数字 0 - 9 和字母 a - f。 
See also fromHex().

函数十一:std::string QByteArray::toStdString() const
返回std :: string对象,带有QByteArray中包含的数据的.

Qt总结之十五:QByteArray详解相关推荐

  1. C语言基础篇 (二十五) 详解C语言第一大功臣:函数

    文章目录 C语言为什么有函数? 函数书写的一般原则 函数是动词,变量是名词 函数的实质是:数据处理器 函数的基本使用 函数原型和作用 编译器的工作流程 C语言为什么有函数? 1.整个程序分成多个文件, ...

  2. 【iOS-Cocos2d游戏开发之十五】详解CCProgressTimer 进度条并修改cocos2d源码实现“理想”游戏进度条!...

    为什么80%的码农都做不了架构师?>>>     李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接:  http://www.himigam ...

  3. [网络安全自学篇] 四十五.病毒详解及批处理病毒原理分析(自启动、修改密码、定时关机、蓝屏、进程关闭)

    这是作者的网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步.前文分享了Windows远程桌面服务漏洞(CVE-2019-0708),并详细讲 ...

  4. 第十五期:详解Java集合框架,让你全面掌握!

    一.Java集合框架概述 集合可以看作是一种容器,用来存储对象信息.所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下. 数组与集合的区别如下 ...

  5. Unity3d开发之十五:详解困惑,事件分发和侦听系统(委托实现)

    事件系统的实现 派发事件 监听事件 移除监听 End 前言: 我们主要实现的是事件分发系统,通过分发事件,和监听事件来传达我们的消息! 其实: 我们主要分成了三个模块: 派发事件,添加监听,移除监听! ...

  6. C++框架_之Qt的信号和槽的详解

    目录 C++_之Qt的信号和槽的详解 1.概述 1.1对象树(子对象动态分配空间不需要释放) 2.信号和槽 Qt5 的书写方式:(推荐的使用)★★★★★ Qt4 的书写方式: 3.自定义信号槽 3.1 ...

  7. Qt总结之十三:QUDPSocket详解

    前言 (一)和本文有关的博客 八大字符转换方式可参考文章:https://blog.csdn.net/Aidam_Bo/article/details/84111776 uint8_t / uint1 ...

  8. 极智AI | 量化实现分享五:详解格灵深瞳 EQ 量化算法实现

    欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   大家好,我是极智视界,本文剖析一下格灵深瞳 ...

  9. 五步详解小学数学之盈亏问题

    给幺儿写了一个五步详解小学盈亏问题,比网上搜到的简单明了: 一.两大元素概念: 二.盈与亏的概念: 三.解决盈亏问题,套用的公式 四.问题中除了盈.亏,还有平,就是刚好分完的情况: 五.最后的大bos ...

  10. 十二、详解计算网络中的流量控制和差错控制、HDLC

    十二.详解计算网络中的流量控制和差错控制 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动 ...

最新文章

  1. 大数据、云计算构筑百姓安全防护网
  2. linux 文本处理 awk 几个特殊的内置变量
  3. Extension project: 404 Not Found for resources/cus/crm/notes/ext/Component-dbg.js
  4. SAP gateway 后台系统的 OData service 服务探测机制实现原理
  5. --@angularJS--自定义服务与后台数据交互小实例
  6. java 蓝桥杯算法训练 最大值与最小值的计算(题解)
  7. php集合与数组的区别,php数组和链表的区别总结
  8. 0517 libdroid MyDriver2-397 easy_go攻防世界
  9. 11.7 项目:下载所有 XKCD 漫画
  10. bind 完成正确安装
  11. 脊柱外科患者资料管理系统
  12. case 书写的要求与思路
  13. CTF warmup
  14. 基于网页的微信小程序——摇色子
  15. 移动硬盘插到电脑后显示在设备和打印机解决办法
  16. 车机开发之添加自定义键
  17. Latex罗马数字(一)
  18. AngularJs - Javascript MVC 框架
  19. 索尼 电视 android 8,索尼4K液晶电视X9500G采用安卓8.0智能系统 是游戏爱好者的最佳选择...
  20. HttpStatus状态详解

热门文章

  1. 【操作系统/OS笔记10】进程/线程的调度原则、调度算法、实时调度、多处理器调度、优先级反转
  2. oracle 01157,Oracle数据库启动时出现ORA-01157和ORA-01110问题
  3. 关于linux低端内存
  4. vue中v-show v-if v-bind的使用
  5. 总结一下最近面试经常被问到的问题(2019年4月)
  6. 图书配套光盘、部分软件下载
  7. Trufun Kant Studio 2008面向VS.NET的开发应用
  8. linux find返回数据不一样,请问一个linux的find的问题,如何让find的返回结果不显示“Perm...
  9. 使用Python在ArcGIS中编程杂谈
  10. golang之正则校验(验证某字符串是否符合正则表达式)