QByteArray的toHex()函数实现

本文阅读 1 分钟
首页 应用开发 正文

一、什么是Hex

平时我们所看到的数字0-9是十进制,Hex则是0-F十六进制.

二、作用

将不可见的十六进制内存数据转换为可显示的字符串

三、代码实现

Qt:

QByteArray QByteArray::toHex(char separator) const
{
    if (!d->size)
        return QByteArray();
    //一个字节会形成两个字符,最终长度是原始数据的2倍
    const int length = separator ? (d->size * 3 - 1) : (d->size * 2);
    QByteArray hex(length, Qt::Uninitialized);
    char *hexData = hex.data();
    const uchar *data = (const uchar *)d->data();
    for (int i = 0, o = 0; i < d->size; ++i) {
        //分别获取高四位,低四位的内容,将两个数值,转为字符
        hexData[o++] = QtMiscUtils::toHexLower(data[i] >> 4);
        hexData[o++] = QtMiscUtils::toHexLower(data[i] & 0xf);

        if ((separator) && (o < length))
            hexData[o++] = separator;
    }
    return hex;
}
//numbers 0-9 and the letters a-f.
Q_DECL_CONSTEXPR inline char toHexLower(uint value) Q_DECL_NOTHROW
{
    // 字符串本身即为指针,相当于数组成员和value进行&操作
    return "0123456789abcdef"[value & 0xF];
}

魔改版:

    ByteArray ByteArray::toHex(char separator) const
    {
        if (!m_size)
        {
            return ByteArray();
        }

        const char HEX_NUMBERS[16] = {
          '0', '1', '2', '3',
          '4', '5', '6', '7',
          '8', '9', 'a', 'b',
          'c', 'd', 'e', 'f' };

        // 一个字节会形成两个字符,最终长度是原始数据的2倍
        const unsigned int length = separator ? (m_size * 3 - 1) : (m_size * 2);

        ByteArray hex;
        hex.resize(length);
        unsigned char* data = (unsigned char*)hex.data();
        for (unsigned int i = 0, o = 0; i < m_size; ++i)
        {
            unsigned char t = reinterpret_cast<unsigned char*>(m_buffer)[i];
            unsigned char high = t / 16;
            unsigned char low = t % 16;
            data[o++] = HEX_NUMBERS[high];
            data[o++] = HEX_NUMBERS[low];
            if (separator && (o < length))
            {
                data[o++] = separator;
            }
        }
        return hex;
    }
本文来自投稿,不代表本站立场,如若转载,请注明出处:
Linux修改SSH端口号
« 上一篇 09-08
C++获取当前目录
下一篇 » 01-11