QT——QByteArray及QBuffer

QT——QByteArray及QBuffer

QT——QByteArray及QBuffer

SmartSmall 2014-05-26 11:48:48 QT——QByteArray及QBuffer 28998 QT——QByteArray及QBuffer 已收藏 1

分类专栏: Qt

版权

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.

上一篇:QByteArray 转 QBitArray


下一篇:Qt中的数据类型转换