QByteArray详解

本博客实在别人的基础上修改了,主要目的是整理记忆。 QtCreate自带帮助文档,按F1查看,文档非常详细。查看帮助文档结合自己的理解对下面的介绍进行了补全。

QByteArray在串口通讯中经常被使用,有一定必要较为全面详细的对QByteArray进行阐述。本文通过以下几个部分加以介绍:
1. 初始化

2. 访问与赋值

3. 添加、删除、插入与替换操作

4. 查找与比较

5. 数据转换与处理

1 初始化

 


2 访问与赋值
    访问QByteArray主要有4中方式,分别为[]、at()、data[]和constData[]。其中[]和data[]为可读可写,at()和constData[]仅为可读。如果仅是读,则通过at()和constData[]访问速度最快,因可避免复制处理。示例如下:

QByteArray ba;
ba.resize(6);
ba[0] = 0x3c;
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;
ba.data()[5] = 0x31;
qDebug()<<"[]"< qDebug()<<"at()"< qDebug()<<"data()"< qDebug()<<"constData()"< qDebug()<<"constData()"< 3 添加、删除、插入与替换操作

添加 

QByteArray详解_第1张图片

QByteArray详解_第2张图片

删除

QByteArray详解_第3张图片

插入

QByteArray详解_第4张图片

QByteArray详解_第5张图片

 

替换

QByteArray详解_第6张图片

 

 

4 查找与比较

实现查找及遍历数据即可

    for (int i = 0; i < ba.size(); ++i) {
        //if (ba.at(i) >= 'a' && ba.at(i) <= 'f')
        //    qDebug() << "Found character in range [a-f]";
        //qDebug()<
       qDebug()<<"data="<
    }
    QByteArray::Iterator begin = ba.begin();
    QByteArray::Iterator end = ba.end();
    while (begin != end)
    {
        uint8_t u8Tmp = static_cast(*begin);
        qDebug()<<"begin"<
        begin++;
    }

5 数据转换与处理
    从串口读取到的QByteArray数据,一般需要进行提取和解析,此时就需要QByteArray转换为各类型数据。常用转换包括:

    1)转为HEX,用于显示十六进制,这点在调试时特别有用,因为大多HEX码是没有字符显示的,如0x00、0x20等等;

    2)转为不同进制数值并显示,如二进制、八进制、十进制和十六进制等;

    3)转为整型、浮点型等数值类型;

    4)大小写转换;

    5)转为字符串类型;

5.1 Hex转换
    把Hex编码转换为char存储到QByteArray:

QByteArray text = QByteArray::fromHex("517420697320677265617421");
text.data();            // returns "Qt is great!"
    把QByteArray转为Hex编码:

QByteArray ba;
ba.resize(3);
ba[0] = 0x30;
ba[1] = 0x31;
ba[2] = 0x32;
qDebug() << ba.toHex(); //return "303132"
5.2 数值转换与输出
    尽管QByteArray是一个集合,但也可以作为一个特殊形式的数值用,其灵活的转换格式,可大大方便各种格式数据转换与显示的需求。如显示二进制和十六进制、显示科学计数和指定小数位的数值。示例如下:

    把单个字符转为2-36进制数据格式:

int n = 63;
qDebug()< qDebug()< qDebug()< qDebug()< qDebug()<     按照指定进制格式直接复制,其中n可以是各类常见数值类型:

QByteArray ba;
int n = 63;
ba.setNum(n);           // ba == "63"
ba.setNum(n, 16);       // ba == "3f"
    把数值按指定格式和小数位转换输出,小数位四舍五入:

QByteArray ba1 = QByteArray::number(12.3456, 'E', 3);
QByteArray ba2 = QByteArray::number(12.3456, 'f', 3);
qDebug()< qDebug()< 5.3 字符串数值转为各类数值
    QByteArray若为数值,可通过to**方法转为各种类型数据,示例如下:

QByteArray strInt("1234");
bool ok0;
qDebug() << strInt.toInt();   // return 1234
qDebug() << strInt.toInt(&ok0,16);   // return 4660, 默认把strInt作为16进制的1234,对应十进制数值为4660
 
QByteArray string("1234.56");
bool ok1;
qDebug() << string.toInt();   // return 0, 小数均视为0
qDebug() << string.toInt(&ok1,16);   // return 0, 小数均视为0
qDebug() << string.toFloat();   // return 1234.56
qDebug() << string.toDouble();   // return 1234.56
 
QByteArray str("FF");
bool ok2;
qDebug() << str.toInt(&ok2, 16);     // return 255, ok2 == true
qDebug() << str.toInt(&ok2, 10);     // return 0, ok == false, 转为十进制失败
5.4 大小写转换
    QByteArray若为带大小写的字符串,可通过toUpper()和toLower()方法实现大小写转换,示例如下:

QByteArray x("Qt by THE QT COMPANY");
QByteArray y = x.toLower();
// y == "qt by the qt company"
 
QByteArray z = x.toUpper();
// z == "QT BY THE QT COMPANY"
5.5 与字符串互转
    QByteArray与QString互转极为简单,二者从本质上类似,都是连续存储,区别是前者可以存无法显示的字符,后者只存可显示的字符。如QByteArray可以存0x00-0x19,而QString则存储如0x30等可显示字符(0x20-0x7E)。可显示字符可参见ASCII表,链接如下:ASCII可显示字符

    QByteArray转为QString示例:

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

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

————————————————
版权声明:本文为CSDN博主「电子技术课程」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ecourse/article/details/80575691

你可能感兴趣的:(QT,c++)