您的位置:首页 > Web前端

QT——QByteArray及QBuffer

2017-05-20 21:35 197 查看

QT——QByteArray及QBuffer

2014-05-26 11:48
4309人阅读 评论(0)
收藏
举报

本文章已收录于:


分类:
Qt(38)




作者同类文章X
Qt——QT实现截屏功能

QT——基于Qt多媒体技术和编码技术的本地音视频远程传输

QT——与 Javascript 交互

QT——QWebView、QWebPage和QWebFrame之间关系

Qt+VS2012 搭建环境

更多

版权声明:本文为博主原创文章,未经博主允许不得转载。

1)QByteArray类提供了一个[字节]数组。QByteArray 既可以存储原始的字节(包括'\0'),又可以被用来存储惯例上8位以'\0'结尾的字符串。<可以理解为字符数组,charstr[]
= {'h','e','l','l','o','\0'} 或者 char
str = "hello">。由于QByteArray封装的功能很多,使用起来比char*要方便的多,而就其内部实现来讲,它会保证所有的数据以'\0'结尾,使用隐式数据共享(copy-on-write)来减少内存消耗以及不必要的数据拷贝。


2)除了QByteArray,Qt中还提供了QString类来存储字符串,大部分情况下,我们都是在使用QString。QString存储了16位unicode码,很容易用来存储非ASCII或是非Lantin1的编码,另外QString在所有的QtAPI中都是通用的。

3)有两种情况下会比较适合使用QByteArray,第一就是要存储纯二进制数据(raw binary data)或8-bit编码文本字符串,第二种情况就是在内存资源很珍贵的情况下,例如 Qt for
Embedded
Linux。


----------------------------------------------------------------------

4)一种初始化QByteArray方式是给它的构造函数传入一个const char* 即可。此时,QByteArray执行了深拷贝(deep copy、如值类型),如果出于效率考虑不想执行深拷贝,使用QByteArray::fromRawData(const
char * data, int siz)/* 返回的 QByteArray 对象将会和数据指针相关联 */。  


QByteArrayarray("Hello");array的size( )是5,但由于其在最后要存储额外的'\0',其实际占用空间是6。

=============================常用操作函数==============================

1、int QByteArray::size() const /*
sizeof() */

如果QByteArray在从 raw 数据创建时,不包含尾随的终止符,QByteArray不会自动调用添加,除非通过深拷贝进行创建:
QByteArray ba("Hello");

int n = ba.size();          // n == 5

ba.data()[0];               // returns 'H'

ba.data()[4];               // returns 'o'

ba.data()[5];               // returns '\0'


----------------------------------------------------------------------

2、跟C++的普通数组一样,也可以使用 [] 来访问其具体下表对应的字节,对于非const的 QByteArray,可以直接进行赋值:

1. QByteArray array;

2. array.resize( 5 );

3. array [0] = 0x3c;

4. array [1] = 0xb8;

5. array [2] = 0x64;

6. array [3] = 0x18;

7. array [4] = 0xca;


----------------------------------------------------------------------

3.对于只读操作,请使用“at( )“,因为它可以避免深拷贝,比使用“[ ]“要快,效率要高:

1. for ( int  i  =  0 ;  i  <  array.size( ) ; ++ i )  {

2.     if ( array.at(i )  >=  'a'  &&  array.at(i )  <=  'f')

3.         cout <<  "Found character in range [ a – f ] "  <<  endl ;

4. }


----------------------------------------------------------------------


4、使用left( ), right( ), 或者 mid,一次取出多个字符。

1)QByteArray QByteArray ::left(int len) const

The entire byte array is returned if len is greater than size().

Example:

  QByteArray x("Pineapple");

  QByteArray y = x.left(4);

  // y == "Pine"


2)QByteArray QByteArray::right(int len) const

The entire byte array is returned if len is greater than size().

Example:

  QByteArray x("Pineapple");

  QByteArray y = x.right(5);

  // y == "apple"



3)QByteArray QByteArray::mid(int pos, int len = -1) const



pos 作为起点,返回指定字节长度的 array ,如果 len 为-1(默认),或者 pos+len >= size(),将返回从指定为pos开始直到字节数组尾的所有字节。

Example:
 QByteArray x("Five pineapples");

 QByteArray y = x.mid(5, 4);     // y == "pine"

 QByteArray z = x.mid(5);        // z == "pineapples"

----------------------------------------------------------------------


5、char * QByteArray::data()//Returns a pointer to the data stored in the byte array

   const char * QByteArray::constData() const//Returns a pointer to the data stored in the byte array

通过data() 或者constData()可以获得 QByteArray 的真实数据的指针,获得的数据指针在调用QByteArray的non-const函数之前都是有效的。



6、uint qstrlen(const char * str)  /* 如C++中的strlen() */

Returns the number of characters that precede(先于) the terminating '\0', or 0 if str is 0.

>>>size()和qtrlen()的返回值:
QByteArray array
= "hello world!";

printf("%d\n", array.size( )-1 );

printf("%c\n", array.data()[array.size()]); 

printf("%d\n", qstrlen( ( const char* ) array.data( ) ) );


7、QByteArray 提供了很多修改字节的方法: append(),  prepend(),  insert(), replace() and remove()。

如下所示:

       QByteArray x("and");

       x.prepend("rock ");         // x == "rock and"

       x.append(" roll");          // x == "rock and roll"

       x.replace(5, 3, "&");       // x == "rock & roll"


=====================================================================

8、QBuffer 类是一个操作QByteArray 的输入/输出设备的接口。// TheQBuffer class provides aQIODeviceinterface
for a QByteArray .


构造函数:QBuffer(QByteArray * byteArray, QObject * parent = 0)


----------------------------------------------------------------------

QBuffer 类用来读写内存缓存。在使用之前使用 open() 来打开缓存并且设置模式(只读、只写等等)。

QDataStream 和 QTextStream 也可以使用一个 QByteArray 参数来构造,这些构造函数创建并且打开一个内部的QBuffer。

QDataStream::QDataStream(QByteArray * a, QIODevice::OpenMode mode)


/*The QDataStream class provides serialization of binary data to a QIODevice*/

----------------------------------------------------------------------

QTextStream(QByteArray * array, QIODevice::OpenMode openMode = QIODevice::ReadWrite)

----------------------------------------------------------------------


const QByteArray & QBuffer::data() const//Returns the data contained in the buffer.



顶 2 踩 0
 
 
上一篇QT——QThread线程

下一篇QT——JPEG图像的压缩与传输

Qt中QStringcharintQByteArray之间到转换 转载Qt中QstringcharintQByteArray之间到转换转Qt中的QStringQByteArrayQchar charQt中QstringcharintQByteArray之间到转换Qt深受QByteArray的陷害Qt学习之路51 QByteArray和QVariantQt中QstringcharintQByteArray之间到转换Qt类型转换 QStringintcharQByteArray之间相互转换Qt中的QString和QByteArrayQT学习之类型转换charQStringintQByteArray之间的转换

  相关文章推荐

Qt中QStringcharintQByteArray之间到转换 转载
Qt中QstringcharintQByteArray之间到转换
转Qt中的QStringQByteArrayQchar char
Qt中QstringcharintQByteArray之间到转换
Qt深受QByteArray的陷害
Qt学习之路51 QByteArray和QVariant
Qt中QstringcharintQByteArray之间到转换
Qt类型转换 QStringintcharQByteArray之间相互转换
Qt中的QString和QByteArray
QT学习之类型转换charQStringintQByteArray之间的转换
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: