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.