• QByteArray与char*


    QByteArray可以看作是char*的升级版
    QString可以看作是std::string的升级版

    一、构造

     // 构造空对象, 里边没有数据
     QByteArray::QByteArray();
     // 将data中的size个字符进行构造, 得到一个字节数组对象
     // 如果 size==-1 函数内部自动计算字符串长度, 计算方式为: strlen(data)
     QByteArray::QByteArray(const char *data, int size = -1);
     // 构造一个长度为size个字节, 并且每个字节值都为ch的字节数组
     QByteArray::QByteArray(int size, char ch);
    

    二、访问与赋值

    访问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() << "[]" << 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=
    

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

    四、查找与比较

    五、数据转换与处理

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

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

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

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

    • 4)大小写转换;

    • 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"
    

    2. 数值转换与输出

    尽管QByteArray是一个集合,但也可以作为一个特殊形式的数值用,其灵活的转换格式,可大大方便各种格式数据转换与显示的需求。如显示二进制和十六进制、显示科学计数和指定小数位的数值。示例如下:

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

    int n = 63;
    qDebug()<<QByteArray::number(n);              // returns "63"
    qDebug()<<QByteArray::number(n, 16);          // returns "3f"
    qDebug()<<QByteArray::number(n, 16).toUpper();  // returns "3F"
    qDebug()<<QByteArray::number(n, 2);          // returns "111111"
    qDebug()<<QByteArray::number(n, 8);          // returns "77"
    

    按照指定进制格式直接复制,其中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()<<ba1; // returns "1.235E+01"
    qDebug()<<ba2; // returns "12.346"

    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, 转为十进制失败
    ## 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. 与字符串互转

    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"
    

    转载:QByteArray详解

  • 相关阅读:
    基于ZYNQ SOC视频处理的常规设计
    Alinx黑金没有实现利用一个VDMA完成视频流读写的例程
    Vitis软件平台、vitis实例、裸机SOC(SDK)程序移植
    ZYNQ PS端IIC接口使用-笔记
    用信号量实现生产者&消费者模型
    C语言 -- 内存对齐
    排序算法---希尔排序
    排序算法---直接插入排序
    网络套接字编程介绍---UDP通信
    C++实现__搜索二叉树
  • 原文地址:https://www.cnblogs.com/mmmmmmmmm/p/14504646.html
Copyright © 2020-2023  润新知