QByteArray 类 - 最方便的字符数组类

https://zhuanlan.zhihu.com/p/51728642

本文结构如下:

  • 概述
  • 函数详解
    • 初始化
    • 数组信息
    • 增/删/改/查
  • 附:所有函数

概述

啥是字符数组?字符串呗。一般我们用 C++ 的 const char* 来指向一个字符数组,但是操作起来非常的不方便。Qt 提供了 QByteArray 类专门用于字符数组的操作,而且它的结尾始终跟着‘\0’。

注意啊,它和 QString 不是一个东西。QString 里面存的是 Unicode 编码的字符串,而 QByteArray 没有经过编码,是原始的数据。使用 QString 类的场合多,是因为 Qt 的很多函数参数是 QString,另一方面 QString 类可以很方便的存储非 ASCII、非 Latin-1 字符。

其实函数用起来很简单,本文的重点在于“附:所有函数”的分类方法,可以加到自己的笔记本里方便以后快速查用。

函数详解

初始化

QByteArray()
QByteArray(const char *data, int size = -1)
QByteArray(int size, char ch)
QByteArray(const QByteArray &other)
QByteArray(QByteArray &&other)
交换:void swap(QByteArray &other)

实际工程中常用的是第二个构造函数,因为有了指针,所以我们知道了数据在内存中的开头位置,那么用 size 指定我们要多少数据即可。需要说明的是,默认 size 为负,那么 QByteArray 在构造的时候遇到第一个‘\0’空字符时停止。所以如果你要载入的数据中确实有‘\0’的话,需要手动指定 size,否则空字符后面的数据是不会被加载进来的。

关于 swap(),就是交换两个字符数组,执行速度非常的快。

数组信息

是否空
    bool isEmpty() const
    bool isNull() const

由于历史原因,虽然都是空,但 Qt 对字符数组区分了 null 和 empty。我们其实关注的是有没有数据,所以一般就用 isEmpty() 就可以了。如果非要想知道区别,可以看以下代码感受一下:

QByteArray().isEmpty(); // true
QByteArray("").isEmpty(); // true
QByteArray("abc").isEmpty(); // false

QByteArray().isNull(); // true
QByteArray("").isNull(); // false
QByteArray("abc").isNull(); // false

容量

获取
    内存大小:int capacity() const
    字符大小:int count() const == int size() const == int length() const
设置
    不填充:void reserve(int size)
    填充:void resize(int size)
释放不需要的空间
    void squeeze()
    void shrink_to_fit()

关于容量大小,因为每个字符占用一个空间,所以一般分配的内存空间大于数据的字节数,这样才能存放所有的字符。因此,capacity() 函数返回分配的内存空间大小;count()、size()、length() 三者效果一模一样,返回的是字符的数量,当然一个字符是1个字节,因此也可以说是数据的大小。

关于设置容量,一般我们不需要做这样的操作,QByteArray 会自动管理的。但是 Qt 还是给我们开放了调整分配内存空间大小的函数 reserve() 和 resize()。两者都可以重新调整空间容量,区别在于 reserve() 不会在多余的空间中填充字符,而 resize() 扩大容量后会在多余的空间均填充一些字符,而且填充的字符不确定。

关于释放,squeeze() 等价于 shrink_to_fit()。作用就是当分配容量大于字符数量时,将多余的空间释放掉。

指向数据的指针
    char * data()
    const char * data() const
    const char * constData() const
    QByteArray & setRawData(const char *data, uint size)
    [static]QByteArray fromRawData(const char *data, int size)

关于 data(),返回指向 QByteArray 中字符数组数据的指针,只要不重新分配空间或者销毁,该指针就保持有效。

关于 constData(),如果只读的话该函数非常快,不会导致深层复制。不过一般该函数用于的场合是那些需要 const char* 参数的地方。

关于 setRawData() 和 fromRawData(),两个函数都是从原始数据中构造 QByteArray。看参数是 const char*,说明无论怎么构建 QByteArray,都不会对数据源进行修改,因为隐式共享的原因,只要用 QByteArray 修改一个字符,就会引发深拷贝。

增/删/改/查

删除
    前后
        删除后n个字符void chop(int n)
        保留前n个字符void truncate(int pos)
    中间:QByteArray &remove(int pos, int len)
    删除所有字符:void clear()
    去除空白
        QByteArray simplified() const
        QByteArray trimmed() const

关于 simplified(),作用是删除字符串头尾的空白,同时将字符串中间有空白的地方均用一个空格替换。例如“ lots\t of\nwhitespace\r\n ”->“lots of whitespace”。

关于 trimmed(),作用是仅删除字符串头尾的空白。

查找
    判断数组中的内容
        是否包含
            开头
                bool startsWith(const QByteArray &ba) const
                bool startsWith(char ch) const
                bool startsWith(const char *str) const
            中间任意位置
                bool contains(const QByteArray &ba) const
                bool contains(const char *str) const
                bool contains(char ch) const
            结尾
                bool endsWith(const QByteArray &ba) const
                bool endsWith(char ch) const
                bool endsWith(const char *str) const
        包含的字符所在位置
            int indexOf(const QByteArray &ba, int from = 0) const
            int indexOf(const char *str, int from = 0) const
            int indexOf(char ch, int from = 0) const
            int indexOf(const QString &str, int from = 0) const
            int lastIndexOf(const QByteArray &ba, int from = -1) const
            int lastIndexOf(const char *str, int from = -1) const
            int lastIndexOf(char ch, int from = -1) const
            int lastIndexOf(const QString &str, int from = -1) const
        出现次数
            int count(const QByteArray &ba) const
            int count(const char *str) const
            int count(char ch) const
    提取内容
        单个字符
            第一个
                char front() const
                QByteRef front()
            中间
                char at(int i) const
                char operator[](uint i) const
                char operator[](int i) const
                QByteRef operator[](int i)
                QByteRef operator[](uint i)
            最后一个
                char back() const
                QByteRef back()
        字符串
            直接提取
                左:QByteArray left(int len) const
                中:QByteArray mid(int pos, int len = -1) const
                右:QByteArray right(int len) const
            删除后提取
                QByteArray chopped(int len) const
        切分:QList<QByteArray> split(char sep) const

关于查找,主要包含判断内容和内容提取两部分。判断内容就是字符数组中是否包含某某字符之类的,内容提取就是从字符串中获取子字符串内容。

QByteArrayLiteral(ba)
QT_NO_CAST_FROM_BYTEARRAY

关于 QByteArrayLiteral,作用就是在编译期构造好 QByteArray,而无需在运行期再去构造。如下代码所示,在程序运行的时候,第一个代码会创建临时的 QByteArray 而第二个代码不需要,因为它已经在我们编译的时候就创建好了。

if (node.hasAttribute("length"))
if (node.hasAttribute(QByteArrayLiteral("length")))

关于 QT_NO_CAST_FROM_BYTEARRAY,就是禁用从 QByteArray 到 const char * 或 const void * 的自动转换。

附:所有函数

初始化
    QByteArray()
    QByteArray(const char *data, int size = -1)
    QByteArray(int size, char ch)
    QByteArray(const QByteArray &other)
    QByteArray(QByteArray &&other)
    交换:void swap(QByteArray &other)
数组信息
    是否空
        bool isEmpty() const
        bool isNull() const
    容量
        获取
            内存大小:int capacity() const
            字符大小:int count() const == int size() const == int length() const
        设置
            不填充:void reserve(int size)
            填充:void resize(int size)
        释放不需要的空间
            void squeeze()
            void shrink_to_fit()
    指向数据的指针
        char * data()
        const char *data() const
        const char *constData() const
        QByteArray &setRawData(const char *data, uint size)
        [static]QByteArray fromRawData(const char *data, int size)
///
    增加
        从前面
            QByteArray &prepend(const QByteArray &ba)
            QByteArray &prepend(int count, char ch)
            QByteArray &prepend(const char *str)
            QByteArray &prepend(const char *str, int len)
            QByteArray &prepend(char ch)
            void push_front(const QByteArray &other)
            void push_front(const char *str)
            void push_front(char ch)
        从中间
            QByteArray &insert(int i, const QByteArray &ba)
            QByteArray &insert(int i, int count, char ch)
            QByteArray &insert(int i, const char *str)
            QByteArray &insert(int i, const char *str, int len)
            QByteArray &insert(int i, char ch)
            QByteArray &insert(int i, const QString &str)
        从后面
            QByteArray &append(const QByteArray &ba)
            QByteArray &append(int count, char ch)
            QByteArray &append(const char *str)
            QByteArray &append(const char *str, int len)
            QByteArray &append(char ch)
            QByteArray &append(const QString &str)
            void push_back(const QByteArray &other)
            void push_back(const char *str)
            void push_back(char ch)
    删除
        前后
            删除后n个字符void chop(int n)
            保留前n个字符void truncate(int pos)
        中间:QByteArray &remove(int pos, int len)
        删除所有字符:void clear()
        去除空白
            QByteArray simplified() const
            QByteArray trimmed() const
    修改
        填充
            左:QByteArray leftJustified(int width, char fill = ' ', bool truncate = false) const
            全部:QByteArray & fill(char ch, int size = -1)
            右:QByteArray rightJustified(int width, char fill = ' ', bool truncate = false) const
        复制多次:QByteArray repeated(int times) const
        替换
            QByteArray &replace(int pos, int len, const QByteArray &after)
            QByteArray &replace(int pos, int len, const char *after, int alen)
            QByteArray &replace(int pos, int len, const char *after)
            QByteArray &replace(char before, const char *after)
            QByteArray &replace(char before, const QByteArray &after)
            QByteArray &replace(const char *before, const char *after)
            QByteArray &replace(const char *before, int bsize, const char *after, int asize)
            QByteArray &replace(const QByteArray &before, const QByteArray &after)
            QByteArray &replace(const QByteArray &before, const char *after)
            QByteArray &replace(const char *before, const QByteArray &after)
            QByteArray &replace(char before, char after)
            QByteArray &replace(const QString &before, const char *after)
            QByteArray &replace(char before, const QString &after)
            QByteArray &replace(const QString &before, const QByteArray &after)
    查找
        判断数组中的内容
            是否包含
                开头
                    bool startsWith(const QByteArray &ba) const
                    bool startsWith(char ch) const
                    bool startsWith(const char *str) const
                中间任意位置
                    bool contains(const QByteArray &ba) const
                    bool contains(const char *str) const
                    bool contains(char ch) const
                结尾
                    bool endsWith(const QByteArray &ba) const
                    bool endsWith(char ch) const
                    bool endsWith(const char *str) const
            包含的字符所在位置
                int indexOf(const QByteArray &ba, int from = 0) const
                int indexOf(const char *str, int from = 0) const
                int indexOf(char ch, int from = 0) const
                int indexOf(const QString &str, int from = 0) const
                int lastIndexOf(const QByteArray &ba, int from = -1) const
                int lastIndexOf(const char *str, int from = -1) const
                int lastIndexOf(char ch, int from = -1) const
                int lastIndexOf(const QString &str, int from = -1) const
            出现次数
                int count(const QByteArray &ba) const
                int count(const char *str) const
                int count(char ch) const
        提取内容
            单个字符
                第一个
                    char front() const
                    QByteRef front()
                中间
                    char at(int i) const
                    char operator[](uint i) const
                    char operator[](int i) const
                    QByteRef operator[](int i)
                    QByteRef operator[](uint i)
                最后一个
                    char back() const
                    QByteRef back()
            字符串
                直接提取
                    左:QByteArray left(int len) const
                    中:QByteArray mid(int pos, int len = -1) const
                    右:QByteArray right(int len) const
                删除后提取
                    QByteArray chopped(int len) const
	        切分:QList<QByteArray> split(char sep) const
转换
    大小写
        bool isLower() const
        bool isUpper() const
        QByteArray toLower() const
        QByteArray toUpper() const
    数字
        int 
            QByteArray & setNum(int n, int base = 10)
            int toInt(bool *ok = nullptr, int base = 10) const
        unsigned int 
            QByteArray & setNum(uint n, int base = 10)
            uint toUInt(bool *ok = nullptr, int base = 10) const
        short 
            QByteArray & setNum(short n, int base = 10)
            short toShort(bool *ok = nullptr, int base = 10) const
        unsigned short 
            QByteArray & setNum(ushort n, int base = 10)
            ushort toUShort(bool *ok = nullptr, int base = 10) const
        long long 
            QByteArray & setNum(qlonglong n, int base = 10)
            qlonglong toLongLong(bool *ok = nullptr, int base = 10) const
        unsigned long long 
            QByteArray & setNum(qulonglong n, int base = 10)
            qulonglong toULongLong(bool *ok = nullptr, int base = 10) const
        float 
            QByteArray & setNum(float n, char f = 'g', int prec = 6)
            float toFloat(bool *ok = nullptr) const
        double 
            QByteArray & setNum(double n, char f = 'g', int prec = 6)
            double toDouble(bool *ok = nullptr) const
        十六进制
            QByteArray toHex() const
            QByteArray toHex(char separator) const
            [static]QByteArray fromHex(const QByteArray &hexEncoded)
    Base64
        QByteArray toBase64() const
        QByteArray toBase64(QByteArray::Base64Options options) const
        [static]QByteArray fromBase64(const QByteArray &base64)
        [static]QByteArray fromBase64(const QByteArray &base64, QByteArray::Base64Options options)
    CFData
        CFDataRef toCFData() const
        CFDataRef toRawCFData() const
        [static]QByteArray fromCFData(CFDataRef data)
        [static]QByteArray fromRawCFData(CFDataRef data)
    NSData
        NSData * toNSData() const
        NSData * toRawNSData() const
        [static]QByteArray fromNSData(const NSData *data)
        [static]QByteArray fromRawNSData(const NSData *data)
    URL
        QByteArray toPercentEncoding(const QByteArray &exclude = QByteArray(), const QByteArray &include = QByteArray(), char percent = '%') const
        QByteArray fromPercentEncoding(const QByteArray &input, char percent = '%')
    StdString
        std::string toStdString() const
        [static]QByteArray fromStdString(const std::string &str)
比较字符串
    int compare(const char *c, Qt::CaseSensitivity cs = ...) const
    int compare(const QByteArray &a, Qt::CaseSensitivity cs = ...) const
游标
    QByteArray::iterator begin()
    QByteArray::const_iterator begin() const
    QByteArray::const_iterator cbegin() const
    QByteArray::const_iterator cend() const
    QByteArray::const_iterator constBegin() const
    QByteArray::const_iterator constEnd() const
    QByteArray::const_reverse_iterator crbegin() const
    QByteArray::const_reverse_iterator crend() const
    QByteArray::iterator end()
    QByteArray::const_iterator end() const
    QByteArray::reverse_iterator rbegin()
    QByteArray::const_reverse_iterator rbegin() const
    QByteArray::reverse_iterator rend()
    QByteArray::const_reverse_iterator rend() const
非成员相关函数
    CRC16校验和
        quint16 qChecksum(const char *data, uint len)
        quint16 qChecksum(const char *data, uint len, Qt::ChecksumType standard)
    /压缩
        QByteArray qCompress(const uchar *data, int nbytes, int compressionLevel = -1)
        QByteArray qCompress(const QByteArray &data, int compressionLevel = -1)
        QByteArray qUncompress(const uchar *data, int nbytes)
        QByteArray qUncompress(const QByteArray &data)
    类似C函数
        int qsnprintf(char *str, size_t n, const char *fmt, ...)
        int qstrcmp(const char *str1, const char *str2)
        char *qstrcpy(char *dst, const char *src)
        char *qstrdup(const char *src)
        int qstricmp(const char *str1, const char *str2)
        uint qstrlen(const char *str)
        int qstrncmp(const char *str1, const char *str2, uint len)
        char *qstrncpy(char *dst, const char *src, uint len)
        int qstrnicmp(const char *str1, const char *str2, uint len)
        uint qstrnlen(const char *str, uint maxlen)
        int qvsnprintf(char *str, size_t n, const char *fmt, va_list ap)

    QByteArrayLiteral(ba)
    QT_NO_CAST_FROM_BYTEARRAY

发布了42 篇原创文章 · 获赞 148 · 访问量 41万+

猜你喜欢

转载自blog.csdn.net/baidu_37503452/article/details/104410456