QByteArray与QBuffer

本文详细介绍了Qt中的QByteArray类,探讨了QByteArray与QString的区别及应用场景,并讲解了如何使用QByteArray进行字节操作,包括初始化、访问元素、截取子串等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:http://blog.youkuaiyun.com/u012627502/article/details/27060477

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值