QByteArray相关总结

QByteArray类

1.提供一个字节数组,QByteArray可用于存储原始二进制字节(包括“\ 0” )和传统的8-bits的“\ 0” 端接字符串 . 使用QByteArray比使用const char *更方便。一般在需要传输原始数据和内存资源短缺时使用。

2.QByteArray存储的是char型字符,继承自QMemArray< char >,但QByteArray提供的数组操作,比char更方便。

3.QString转Qchar时,需要经过 QByteArray,不能用下面的转换形式char *data = str.toLatin1().data();因为这样的话,str.toLatin1()得到的QByteArray类型结果就不能保存(切记!!!),正确用法如下:

    hex= str.toLatin1();//把string字符串转换为字节流
    char= QByteArray::fromHex(hex);//把字节流转换成char,表示从十六进制数转换成字符串

4.QByteArray与QString互转

QByteArray与QString互转极为简单,二者从本质上类似,都是连续存储,区别是前者可以存无法显示的字符,后者只存可显示的字符。如QByteArray可以存0x00-0x19,而QString则存储如0x30等可显示字符(0x20-0x7E)。可显示字符可参见ASCII表,链接如下:ASCII可显示字符

QByteArray转为QString示例:

QByteArray ba("abc123");
QString str = ba; 
//或str.prepend(ba);
qDebug()<<str ;
//输出:"abc123"

 QString转为QByteArray示例:

QString str("abc123");
QByteArray ba = str.toLatin1();
qDebug()<<ba;
//输出:"abc123"

5.初始化QByteArray数组

方法一:const char *将其传递给其构造函数。例如,以下代码创建一个大小为5的字节数组, 
其中包含数据“Hello”:

QByteArray ba("hello");

虽然size()为5,但是字节数组在最后还会保留一个额外的’\ 0’字符, 
以便如果使用一个函数来请求指向底层数据的指针(例如调用data()),那么指出的数据保证被’\ 0’终止。

方法二:使用resize()设置数组的大小,并初始化每个字节的数据字节.

QByteArray使用基于0的索引,就像C ++数组一样。 
要访问特定索引位置的字节,可以使用operator[] ()在非 常量字节数组上,operator 返回一个可以在赋值左侧使用的字节的引用。例如

/*****************定义赋值数组*****************/
QByteArray ba;
ba.resize(6); //size()大小,不包含'\0' ,qstrlen()包含'\0'
ba[0] = 0x3c;
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;
ba.data()[5] = 0x31;

qDebug()<<"[]"<<ba[2]; //[] d
qDebug()<<"at()"<<ba.at(2); //at() d
qDebug()<<"data()"<<ba.data()[2]; //data() d
qDebug()<<"constData()"<<ba.constData()[2]; //constData() d
qDebug()<<"constData()"<<ba.constData()[5]; //constData() 1


/******************访问数组*******************/
for (int i = 0; i < ba.size(); ++i) 
 {
        if (ba.at(i) >= 'a' && ba.at(i) <= 'f')//对于只读访问,替代语法是使用at()访问,at()与[]效果一样:
		QDebug<< "Found character in range [a-f]" << endl;
}

相关操作方法:

QByteArray .prepend(); // 添加前缀 
QByteArray. append();  //添加后缀 
QByteArray.data();     //返回指向字节数组中存储的数据的指针,访问时采用ba.data()[0]  
QByteArray::fill(char ch, int size = -1); //将字节数组中的每个字节设置为字符ch。如果size与-1(默认值)不同,则字节数组将预先调整为大小。
QByteArray::indexOf(ba, int from = 0); //指定位置
QByteArray::left(int len);           //指定左移
QByteArray::righ(int len);          //指定右移
QByteArray::toHex();
QByteArray::toStdString();

成员函数

函数一: char  *QByteArray::data()
返回指向字节数组中存储的数据的指针。该指针可用于访问和修改组成数组的字节。具体访问字节数组中的某一个,采用ba.data()[0]–>访问第0个

QByteArray ba("Hello world");
char *data = ba.data();//返回一个指向字节数组ba的数据指针,指向第一个字符
qDebug() << ba.data();//打印整个字符
while (*data)
{
    cout << "[" << *data << "]" << endl;
    ++data;
}

得到结果 [ H ] ,[ e ] ,[ l ] ,[ l ] ,[ o ], [ ], [ w ] ,[ r ] ,[ l ] ,[ d ].

函数二:QByteArray &QByteArray::fill(char ch, int size = -1)
将字节数组中的每个字节设置为字符ch。如果size与-1(默认值)不同,则字节数组将预先调整为大小。

QByteArray ba("Istambul");
ba.fill('o');
// ba == "oooooooo"
ba.fill('X', 2);
// ba == "XX"

函数三:int QByteArray::indexOf(const QByteArray &ba, int from = 0) const
返回该字节数组中第一次出现字节数组ba的索引位置,从索引位置向前搜索。如果找不到ba,则返回-1 。

eg:

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 -1

函数四:bool QByteArray::isEmpty() const
如果字节数组的大小为0,返回true; 否则返回false。

函数五:QByteArray QByteArray::left(int len) const
返回一个包含该字节数组最左侧len个字节的字节数组,如果len大于size(),则返回整个字节数组. 
eg:

QByteArray x("Pineapple");
QByteArray y = x.left(4); // y == "Pine"

函数六:QByteArray QByteArray::number(int n, int base = 10)
返回一个字节数组,其中包含等价于数字n到基数的字符串(默认为10)。基数可以是2到36之间的任何值。 
eg:

int n = 63;
QByteArray::number(n);              // returns "63"
QByteArray::number(n, 16);          // returns "3f"
QByteArray::number(n, 16).toUpper();  // returns "3F"

可以理解为 int 类型到QByteArray类型的转化。

函数七:QByteArray &QByteArray::setNum(int n, int base = 10)
将字节数组设置为基数为n的打印值(默认为10)并返回对字节数组的引用。基数可以是介于2和36之间的任何值。对于非10以外的其他值,n被视为无符号整数。

eg:

QByteArray ba;
int n = 63;
ba.setNum(n);           // ba == "63"
ba.setNum(n, 16);       // ba == "3f"

函数八:int QByteArray::size() const
返回此字节数组中的字节数。 
eg:

QByteArray ba("Hello");
int n = ba.size();          // n == 5
ba.data()[0];               // returns 'H'  操作某一位的方法
ba.data()[4];               // returns 'o'
ba.data()[5];               // returns '\0'


函数九:

double QByteArray::toDouble(bool *ok = Q_NULLPTR) const

float QByteArray::toFloat(bool *ok = Q_NULLPTR) const

int QByteArray::toInt(bool *ok = Q_NULLPTR, int base = 10) const

返回转换为double值的字节数组。

eg:

QByteArray string("1234.56");
double a = string.toDouble();   // a == 1234.56

函数十:QByteArray QByteArray::toHex() const
返回字节数组的十六进制编码副本。十六进制编码使用数字 0 - 9 和字母 a - f。 
See also fromHex().

函数十一:std::string QByteArray::toStdString() const
返回std :: string对象,带有QByteArray中包含的数据的.
 

  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值