全球作弊论坛  
  
查看: 59|回复: 0

QByteArray的toHex()函数实现

[复制链接]

10

主题

1

回帖

50

积分

鬼仙

Rank: 2

积分
50
发表于 2024-10-10 10:22:25 | 显示全部楼层 |阅读模式
一、什么是Hex
[color=rgba(0, 0, 0, 0.84)]平时我们所看到的数字0-9是十进制,Hex则是0-F十六进制.
二、作用
[color=rgba(0, 0, 0, 0.84)]将不可见的十六进制内存数据转换为可显示的字符串
三、代码实现
[color=rgba(0, 0, 0, 0.84)]Qt:
  1. QByteArray QByteArray::toHex(char separator) const
  2. {
  3.     if (!d->size)
  4.         return QByteArray();
  5.     //一个字节会形成两个字符,最终长度是原始数据的2倍
  6.     const int length = separator ? (d->size * 3 - 1) : (d->size * 2);
  7.     QByteArray hex(length, Qt::Uninitialized);
  8.     char *hexData = hex.data();
  9.     const uchar *data = (const uchar *)d->data();
  10.     for (int i = 0, o = 0; i < d->size; ++i) {
  11.         //分别获取高四位,低四位的内容,将两个数值,转为字符
  12.         hexData[o++] = QtMiscUtils::toHexLower(data[i] >> 4);
  13.         hexData[o++] = QtMiscUtils::toHexLower(data[i] & 0xf);

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

[color=rgba(0, 0, 0, 0.84)]魔改版:
  1.     ByteArray ByteArray::toHex(char separator) const
  2.     {
  3.         if (!m_size)
  4.         {
  5.             return ByteArray();
  6.         }

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

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

  14.         ByteArray hex;
  15.         hex.resize(length);
  16.         unsigned char* data = (unsigned char*)hex.data();
  17.         for (unsigned int i = 0, o = 0; i < m_size; ++i)
  18.         {
  19.             unsigned char t = reinterpret_cast<unsigned char*>(m_buffer)[i];
  20.             unsigned char high = t / 16;
  21.             unsigned char low = t % 16;
  22.             data[o++] = HEX_NUMBERS[high];
  23.             data[o++] = HEX_NUMBERS[low];
  24.             if (separator && (o < length))
  25.             {
  26.                 data[o++] = separator;
  27.             }
  28.         }
  29.         return hex;
  30.     }
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表