• QT之QByteArry


    QT之QByteArry

    Qt通过QByteArray为我们提供了一个字节数组容器。QByteArray既可以用来存储原始的字节,包括'\0',也可以用来存储传统的8-bit 的以'\0'结尾的字符串。使用QByteArray比使用普通的const char* 更方便。并且,在底层,它可以确保其中存储的数据以'\0'结尾,并且通过隐式共享(写时拷贝)策略减少内存的使用和不必要的数据复制。

    1、QByteArry的初始化

    QByteArray ba;
    ba.resize(3);
    ba[0] = 0x30;
    ba[1] = 0x31;
    ba[2] = 0x32;
    
    QByteArray strInt("1234");
    

    2、QByteArry的访问

    • 1、访问方式共有四种:[]、data[]和at()、 constData[];
    • 2、[]和data[]为可读可写;
    • 3、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]; 
    qDebug()<<"data()"<<ba.data()[2];
    
    //仅读访问
    qDebug()<<"at()"<<ba.at(2); 
    qDebug()<<"constData()"<<ba.constData()[2]; 
    
    

    3、QByteArry的字节大小

    QByteArray可以嵌入“\0” 字节,size()函数总是返回整个数组的大小,包括嵌入的’\ 0’字节,但不包括QByteArray自动添加的终止’\ 0’.

    QByteArray s;
    s.resize(5);
    s[0] = '1';
    s[1] = '2';
    s[2] = '3';
    s[3] = '\0';
    s[4] = 'a';
    cout << s.size() << endl;  //打印大小5,但实际在内存中存储的大小为6,因为自动加了/0的特点
    cout << s << endl; //屏幕打印的是:“123 a”
    
    //s.size()为5,但是字节数组在最后还会保留一个额外的’\ 0’字符, 以便如果使用一个函数来请求指向底层数据的指针(例如调用data()),那么指出的数据保证被’\ 0’终止。
    

    4、QByteArry的相互转换

    5.1 Hex转换(1个hex编码由两个字符构成)

    //把Hex编码转换为char存储到QByteArray:
    QByteArray text = QByteArray::fromHex("517420697320677265617421");
    text.data();            // returns "Qt is great!"
    //"517420697320677265617421" 每两个字符表示一个16进制编码,如51表示"Q"
    
    
    //把QByteArray转为Hex编码:
    QByteArray ba;
    ba.resize(3);
    ba[0] = 0x1;
    ba[1] = 0x2;
    ba[2] = 0x3;
    qDebug() << ba.toHex(); //return "010203"
    

    5.2 数值转换与输出

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

    5.3 QByteArray字符串数值转为各类数值

    QByteArray若为数值,可通过to**方法转为各种类型数据,示例如下:

    QByteArray strInt("1234");
    
    bool ok0;
    
    qDebug() << strInt.toInt();   // return 1234
    
    qDebug() << strInt.toInt(&ok0,16);   // return 4660, 默认把1234作为0x1234,对应十进制数值为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
    

    3、QByteArry的接口函数

    (1). 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 ].
    

    (2). 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"
    

    (3). int QByteArray::indexOf(const QByteArray &ba, int from = 0) const

    //返回该字节数组中第一次出现字节数组ba的索引位置,从索引位置向前搜索。如果找不到ba,则返回-1 。
    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
    

    (4). bool QByteArray::isEmpty() const

    如果字节数组的大小为0,返回true; 否则返回false。
    

    (5). QByteArray QByteArray::left(int len) const

    //返回一个包含该字节数组最左侧len个字节的字节数组,如果len大于size(),则返回整个字节数组. 
    QByteArray x("Pineapple");
    QByteArray y = x.left(4); // y == "Pine"
    

    (6). QByteArray QByteArray::number(int n, int base = 10)

    //返回一个字节数组,其中包含等价于数字n到基数的字符串(默认为10)。基数可以是2到36之间的任何值。 
    int n = 63;
    QByteArray::number(n);              // returns "63"
    QByteArray::number(n, 16);          // returns "3f"
    QByteArray::number(n, 16).toUpper();  // returns "3F"
    //可以理解为 int 类型到QByteArray类型的转化。
    

    (7). QByteArray &QByteArray::setNum(int n, int base = 10)

    //将字节数组设置为基数为n的打印值(默认为10)并返回对字节数组的引用。基数可以是介于2和36之间的任何值。对于非10以外的其他值,n被视为无符号整数。
    QByteArray ba;
    int n = 63;
    ba.setNum(n);           // ba == "63"
    ba.setNum(n, 16);       // ba == "3f"
    

    (8). int QByteArray::size() const

    //返回此字节数组中的字节数。 
         QByteArray ba("Hello");
         int n = ba.size();          // n == 5
         ba.data()[0];               // returns 'H'  操作某一位的方法
         ba.data()[4];               // returns 'o'
         ba.data()[5];               // returns '\0'
    

    (9)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值的字节数组。 
    QByteArray string("1234.56");
    double a = string.toDouble();   // a == 1234.56
    

    (10). QByteArray QByteArray::toHex() const

    返回字节数组的十六进制编码副本。十六进制编码使用数字 0 - 9 和字母 a - f。 
    See also fromHex().
    
  • 相关阅读:
    多个ROS工作空间常见的问题
    ROS tf(现在都使用tf2了)
    ERROR: cannot launch node of type [teleop/teleop_key]: can't locate node [teleop_key] in package [teleop]
    Linux上静态库和动态库的编译和使用
    【C++】类中this指针的理解
    fatal error: No such file or directory
    g2o使用教程
    如何理解二次型
    <ROS> message_filters 对齐多种传感器数据的时间戳
    linux与C内存管理机制
  • 原文地址:https://www.cnblogs.com/retry/p/9328697.html
Copyright © 2020-2023  润新知