南宁建站公司有哪些,商务网站建设的一般流程图,深圳市羽堂品牌设计顾问有限公司,网络营销总结及体会QByteArray字节数组 文章目录 QByteArray字节数组1.1 QByteArray类基本使用说明1.2 设置数组字节大小1.3 返回数组大小1.4 将数据转为其他类型1.5 将数据转为C语言的字符指针返回1.6 数组数据追加1.7 清除数组数据为指定值1.8 数组数据插入1.9 删除指定位置指定长度的数据1.10 …QByteArray字节数组 文章目录 QByteArray字节数组1.1 QByteArray类基本使用说明1.2 设置数组字节大小1.3 返回数组大小1.4 将数据转为其他类型1.5 将数据转为C语言的字符指针返回1.6 数组数据追加1.7 清除数组数据为指定值1.8 数组数据插入1.9 删除指定位置指定长度的数据1.10 替换指定位置的数据1.11 数组数据查找1.12 去除空白字符1.13 QBuffer类介绍1.13.1QBuffer基本使用介绍1.13.2 数据读写示例1.13.3 数据处理一行的数据 1.1 QByteArray类基本使用说明
QByteArray类提供了一个字节数组。
QByteArray可用于存储原始字节包括’\ 0’和传统的8位’\ 0’终止字符串。使用QByteArray比使用const char *方便得多。在幕后它始终确保数据后面跟着’\ 0’终止符并使用隐式共享写时复制来减少内存使用并避免不必要的数据复制。
除了QByteArray之外Qt还提供了QString类来存储字符串数据。对于大多数目的而言QString是常用的类。它存储16位Unicode字符使你可以轻松地在应用程序中存储非ASCII /非拉丁字母字符。此外QString在整个Qt API中都有使用。QByteArray适用的两种主要情况是何时需要存储原始二进制数据何时需要对内存进行保存例如使用Qt for Embedded Linux。
初始化QByteArray的一种方法就是将const char *传递给它的构造函数。例如下面的代码创建一个包含数据“Hello”的大小为5的字节数组
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’。例如
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()。 这些函数返回一个指向数据开头的指针。 该指针保证保持有效直到在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 rollReplace()和remove()函数的前两个参数是要开始擦除的位置和应该擦除的字节数。
将数据附加到非空数组时数组将被重新分配并将新数据复制到它。你可以通过调用reserve()来预防分配一定数量的内存从而避免此行为。你也可以调用capacity()来找出QByteArray实际分配了多少内存。
通常的要求是从字节数组中删除空格字符‘\ n’\ t’等。如果你想从QByteArray的两端删除空格使用trimmed()。如果要从两端删除空格并用字节数组中的单个空格字符替换多个连续的空格请使用simplified()。
如果要查找QByteArray中特定字符或子字符串的所有匹配项请使用indexOf()或lastIndexOf()。前者从一个给定的索引位置开始搜索后者向后搜索。如果他们找到它们它们都会返回字符或子字符串的索引位置;否则它们返回-1。例如下面是一个典型的循环它查找所有出现的特定子字符串
QByteArray ba(We must be bbold/b, very bbold/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可以使用重载操作符比如operator ()operator ()operator ()operator ()等进行比较。该比较仅基于字符的数字值。 QString :: localeAwareCompare()是排序用户界面字符串的更好选择。
由于历史原因QByteArray区分了空字节数组和空字节数组。空字节数组是一个字节数组它使用QByteArray的默认构造函数或通过将const char *0传递给构造函数来初始化。空字节数组是大小为0的任何字节数组。空字节数组始终为空但空字节数组不一定为空
QByteArray().isNull(); // returns true
QByteArray().isEmpty(); // returns trueQByteArray().isNull(); // returns false
QByteArray().isEmpty(); // returns trueQByteArray(abc).isNull(); // returns false
QByteArray(abc).isEmpty(); // returns false除了isNull()以外所有函数都将空字节数组视为空字节数组。例如data()返回一个指向空字节数组不是空指针的’\ 0’字符的指针并且QByteArray()将等于QByteArray(“”)。建议始终使用isEmpty()并避免使用isNull()。
有关语言环境的注释
数字字符串转换
执行数字数据类型和字符串之间的转换的函数在C语言环境中执行与用户的区域设置无关。使用QString在数字和字符串之间执行区域识别转换。
8位字符比较
在QByteArray中大写和小写以及哪个字符大于或小于另一个字符的概念与语言环境有关。这会影响支持不区分大小写选项的函数或比较小写或大写参数的函数。如果两个字符串仅包含ASCII字符则不区分大小写的操作和比较将是准确的。影响的函数contains()indexOf()lastIndexOf()运算符()运算符()运算符()运算符 ()toLower()和toUpper()。
此问题不适用于QStrings因为它使用Unicode的字符。
另请参阅QString和QBitArray。
1.2 设置数组字节大小
void QByteArray::resize(int size)示例
QByteArray All_data; //创建字符数组All_data.resize(888); //指定字节大小1.3 返回数组大小
int QByteArray::length() const
int QByteArray::size() const
int QByteArray::count() const示例:
QByteArray All_data; //创建字符数组
All_data.resize(1024); //指定字节大小
All_data.clear(); //清除字节数组的内容并使其为空。
All_data.append(123456789);
qDebug()All_data.size(); //结果: 9
qDebug()All_data.length(); //结果:91.4 将数据转为其他类型
double QByteArray::toDouble(bool * ok 0) const
float QByteArray::toFloat(bool * ok 0) const
QByteArray QByteArray::toHex() const
int QByteArray::toInt(bool * ok 0, int base 10) const
long QByteArray::toLong(bool * ok 0, int base 10) const
qlonglong QByteArray::toLongLong(bool * ok 0, int base 10) const示例 QByteArray string(1234.56);double a string.toDouble(); // a 1234.561.5 将数据转为C语言的字符指针返回
const char * QByteArray::data() const1.6 数组数据追加
相关函数:
QByteArray prepend(char c);
QByteArray prepend(int count, char c);
QByteArray prepend(const char *s);
QByteArray prepend(const char *s, int len);
QByteArray prepend(const QByteArray a);
QByteArray append(char c);
QByteArray append(int count, char c);
QByteArray append(const char *s);
QByteArray append(const char *s, int len);
QByteArray append(const QByteArray a);示例:
QByteArray All_data; //创建字符数组
All_data.resize(1024); //指定字节大小
All_data.clear(); //清除字节数组的内容并使其为空。
All_data.append(123);
All_data.append(456);
All_data.append(789);
qDebug()All_data; //结果1234567891.7 清除数组数据为指定值
QByteArray fill(char c, int size -1); //赋值为指定值
void clear(); //将数组清除为0示例:
QByteArray All_data; //创建字符数组
All_data.resize(1024); //指定字节大小
All_data.fill(8); //将数组整体空间数据赋值为指定数据’8’
qDebug()All_data;1.8 数组数据插入
相关函数:
QByteArray insert(int i, char c);
QByteArray insert(int i, int count, char c);
QByteArray insert(int i, const char *s);
QByteArray insert(int i, const char *s, int len);
QByteArray insert(int i, const QByteArray a);示例:
QByteArray All_data; //创建字符数组
All_data.resize(1024); //指定字节大小
All_data.clear(); //清除字节数组的内容并使其为空。
All_data.append(123);
All_data.append(456);
All_data.append(789);
All_data.insert(2,abcd); //从第2个位置插入数据
qDebug()All_data; //结果12abcd34567891.9 删除指定位置指定长度的数据
QByteArray remove(int index, int len);示例:
QByteArray All_data; //创建字符数组
All_data.resize(1024); //指定字节大小
All_data.clear(); //清除字节数组的内容并使其为空。
All_data.append(123);
All_data.append(456);
All_data.append(789);
All_data.remove(3,3); //从第3个位置删除3个数据
qDebug()All_data; //结果1237891.10 替换指定位置的数据
相关函数:
QByteArray replace(int index, int len, const char *s);
QByteArray replace(int index, int len, const char *s, int alen);
QByteArray replace(int index, int len, const QByteArray s);
QByteArray replace(char before, const char *after);
QByteArray replace(char before, const QByteArray after);
QByteArray replace(const char *before, const char *after);
QByteArray replace(const char *before, int bsize, const char *after, int asize);
QByteArray replace(const QByteArray before, const QByteArray after);
QByteArray replace(const QByteArray before, const char *after);
QByteArray replace(const char *before, const QByteArray after);
QByteArray replace(char before, char after);示例:
QByteArray All_data; //创建字符数组
All_data.resize(1024); //指定字节大小
All_data.clear(); //清除字节数组的内容并使其为空。
All_data.append(123456789);
All_data.replace(3,3,abc); //将第3个位置后的3个数据替换为abcqDebug()All_data; //结果123abc7891.11 数组数据查找
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 -11.12 去除空白字符
QByteArray QByteArray::simplified() const返回一个从开始和结束中删除空白的字节数组其中每个内部空白序列都用一个空格替换。
空白表示标准C isspace函数在C语言环境中返回true的任何字符。这包括在ASCII语言环境中的ASCII isspace()函数返回true。这包括ASCII字符’\ t’‘\ n’‘\ v’‘\ f’‘\ r’和’ 。
QByteArray QByteArray::trimmed() const返回从开始和结束删除空白的字节数组。
空白表示标准C isspace函数在C语言环境中返回true的任何字符。这包括ASCII字符’\ t’‘\ n’‘\ v’‘\ f’‘\ r’和’ 。
示例:
QByteArray All_data; //创建字符数组
All_data.resize(1024); //指定字节大小
All_data.clear(); //清空数组All_data.append(*1024,24.56\n);
All_data.append(#12345678\n);qDebug()All_data; //原始结果:*1024,24.56\n#12345678\n
qDebug()All_data.simplified();//去除所有的空白字符结果:*1024,24.56 #12345678
qDebug()All_data.trimmed(); //去掉结尾的空白字符结果:*1024,24.56\n#123456781.13 QBuffer类介绍
1.13.1QBuffer基本使用介绍
说明: QBuffer主要解决char*类型的值。
QBuffer类为QByteArray提供QIODevice接口。
QBuffer允许你使用QIODevice接口访问QByteArray。
QByteArray被视为一个标准的随机访问文件。
例
QBuffer buffer;
char ch;
buffer.open(QBuffer::ReadWrite);
buffer.write(Qt rocks!);
buffer.seek(0);
buffer.getChar(ch); // ch Q
buffer.getChar(ch); // ch t
buffer.getChar(ch); // ch
buffer.getChar(ch); // ch r默认情况下创建QBuffer时为您创建一个内部QByteArray缓冲区。你可以通过调用buffer()直接访问这个缓冲区。 你也可以通过调用setBuffer()或者将你的数组传递给QBuffer的构造函数来将QBuffer与现有的QByteArray一起使用。
调用open()打开缓冲区。 然后调用write()或putChar()写入缓冲区并通过read()readLine()readAll()或getChar()从中读取。 Size()返回缓冲区的当前大小你可以调用seek()来寻找缓冲区中的任意位置。 当你完成访问缓冲区时调用close()关闭释放缓冲区。
以下代码片段显示了如何使用QDataStream和QBuffer将数据写入QByteArray
QByteArray byteArray;
QBuffer buffer(byteArray);
buffer.open(QIODevice::WriteOnly);QDataStream out(buffer);
out QApplication::palette();实际上我们可以将应用程序的QPalette转换为一个字节数组。
以下是如何从QByteArray中读取数据的方法
QPalette palette;
QBuffer buffer(byteArray);
buffer.open(QIODevice::ReadOnly);QDataStream in(buffer);
in palette;QTextStream和QDataStream还提供了便捷的构造函数它们使用QByteArray并在后台创建QBuffer。
当新数据到达缓冲区时QBuffer发射readyRead()信号。 通过连接这个信号你可以在处理之前使用QBuffer来存储临时数据。每次新数据写入缓冲区时QBuffer也会发送bytesWritten()。
另请参阅QFileQDataStreamQTextStream和QByteArray。
1.13.2 数据读写示例
QByteArray All_data; //创建字符数组
All_data.resize(1024); //指定字节大小
All_data.clear(); //清空数组QBuffer buffer;
buffer.setBuffer(All_data); //将QByteArray空间设置给QBuffer
char ch;
buffer.open(QBuffer::ReadWrite); //读写权限打开
buffer.write(123456789);buffer.seek(0); //移动到空间第0个位置buffer.getChar(ch); // ch 1
qDebug()ch;buffer.getChar(ch); // ch 2
qDebug()ch;qDebug()buffer.readAll(); //读取空间全部数据 结果:3456789buffer.seek(0); //移动到空间第0个位置
qDebug()buffer.readAll(); //读取空间全部数据 结果:1234567891.13.3 数据处理一行的数据
QByteArray All_data; //创建字符数组
All_data.resize(1024); //指定字节大小
All_data.clear(); //清空数组QBuffer buffer;
buffer.setBuffer(All_data); //将QByteArray空间设置给QBuffer
char ch;
buffer.open(QBuffer::ReadWrite); //读写权限打开
buffer.write(123\n456\n789\n);
buffer.seek(0); //移动指针为到0
if(buffer.canReadLine())//判断是否可以读取一行数据
{qDebug()buffer.readLine(); //结果:123\n
}
文章转载自: http://www.morning.jrksk.cn.gov.cn.jrksk.cn http://www.morning.fqyxb.cn.gov.cn.fqyxb.cn http://www.morning.rywr.cn.gov.cn.rywr.cn http://www.morning.qkgwx.cn.gov.cn.qkgwx.cn http://www.morning.mjyrg.cn.gov.cn.mjyrg.cn http://www.morning.ssjtr.cn.gov.cn.ssjtr.cn http://www.morning.sgfnx.cn.gov.cn.sgfnx.cn http://www.morning.lqgtx.cn.gov.cn.lqgtx.cn http://www.morning.btblm.cn.gov.cn.btblm.cn http://www.morning.dnhdp.cn.gov.cn.dnhdp.cn http://www.morning.kflzy.cn.gov.cn.kflzy.cn http://www.morning.lzqtn.cn.gov.cn.lzqtn.cn http://www.morning.zmyhn.cn.gov.cn.zmyhn.cn http://www.morning.txqgd.cn.gov.cn.txqgd.cn http://www.morning.mhmcr.cn.gov.cn.mhmcr.cn http://www.morning.pjtw.cn.gov.cn.pjtw.cn http://www.morning.jkszt.cn.gov.cn.jkszt.cn http://www.morning.pgmbl.cn.gov.cn.pgmbl.cn http://www.morning.ncqzb.cn.gov.cn.ncqzb.cn http://www.morning.xfyjn.cn.gov.cn.xfyjn.cn http://www.morning.snlxb.cn.gov.cn.snlxb.cn http://www.morning.nwclg.cn.gov.cn.nwclg.cn http://www.morning.nlnmy.cn.gov.cn.nlnmy.cn http://www.morning.jftl.cn.gov.cn.jftl.cn http://www.morning.hrtwt.cn.gov.cn.hrtwt.cn http://www.morning.zjqwr.cn.gov.cn.zjqwr.cn http://www.morning.csdgt.cn.gov.cn.csdgt.cn http://www.morning.ubpsa.cn.gov.cn.ubpsa.cn http://www.morning.gcfg.cn.gov.cn.gcfg.cn http://www.morning.fbbpj.cn.gov.cn.fbbpj.cn http://www.morning.yltnl.cn.gov.cn.yltnl.cn http://www.morning.qsxxl.cn.gov.cn.qsxxl.cn http://www.morning.sogou66.cn.gov.cn.sogou66.cn http://www.morning.ggnkt.cn.gov.cn.ggnkt.cn http://www.morning.wfzdh.cn.gov.cn.wfzdh.cn http://www.morning.tgtsg.cn.gov.cn.tgtsg.cn http://www.morning.hsjrk.cn.gov.cn.hsjrk.cn http://www.morning.yprnp.cn.gov.cn.yprnp.cn http://www.morning.ktpzb.cn.gov.cn.ktpzb.cn http://www.morning.dndk.cn.gov.cn.dndk.cn http://www.morning.pqyms.cn.gov.cn.pqyms.cn http://www.morning.gmmyn.cn.gov.cn.gmmyn.cn http://www.morning.grbp.cn.gov.cn.grbp.cn http://www.morning.nbsfb.cn.gov.cn.nbsfb.cn http://www.morning.rtzd.cn.gov.cn.rtzd.cn http://www.morning.djxnn.cn.gov.cn.djxnn.cn http://www.morning.crfyr.cn.gov.cn.crfyr.cn http://www.morning.rtpw.cn.gov.cn.rtpw.cn http://www.morning.rjmd.cn.gov.cn.rjmd.cn http://www.morning.tfrmx.cn.gov.cn.tfrmx.cn http://www.morning.fdmfn.cn.gov.cn.fdmfn.cn http://www.morning.bhgnj.cn.gov.cn.bhgnj.cn http://www.morning.jykzy.cn.gov.cn.jykzy.cn http://www.morning.qkrz.cn.gov.cn.qkrz.cn http://www.morning.pxbrg.cn.gov.cn.pxbrg.cn http://www.morning.dyhlm.cn.gov.cn.dyhlm.cn http://www.morning.osshjj.cn.gov.cn.osshjj.cn http://www.morning.nqyzg.cn.gov.cn.nqyzg.cn http://www.morning.tpnch.cn.gov.cn.tpnch.cn http://www.morning.ctwwq.cn.gov.cn.ctwwq.cn http://www.morning.wgzgr.cn.gov.cn.wgzgr.cn http://www.morning.wfdlz.cn.gov.cn.wfdlz.cn http://www.morning.nkhdt.cn.gov.cn.nkhdt.cn http://www.morning.rmyqj.cn.gov.cn.rmyqj.cn http://www.morning.fksxs.cn.gov.cn.fksxs.cn http://www.morning.plydc.cn.gov.cn.plydc.cn http://www.morning.nwczt.cn.gov.cn.nwczt.cn http://www.morning.pxdgy.cn.gov.cn.pxdgy.cn http://www.morning.ltkms.cn.gov.cn.ltkms.cn http://www.morning.npbnc.cn.gov.cn.npbnc.cn http://www.morning.fbtgp.cn.gov.cn.fbtgp.cn http://www.morning.bnxnq.cn.gov.cn.bnxnq.cn http://www.morning.skwwj.cn.gov.cn.skwwj.cn http://www.morning.lkkgq.cn.gov.cn.lkkgq.cn http://www.morning.clbzy.cn.gov.cn.clbzy.cn http://www.morning.mqxrx.cn.gov.cn.mqxrx.cn http://www.morning.knlbg.cn.gov.cn.knlbg.cn http://www.morning.hotlads.com.gov.cn.hotlads.com http://www.morning.lqypx.cn.gov.cn.lqypx.cn http://www.morning.nxwk.cn.gov.cn.nxwk.cn