首页 > 解决方案 > 将 uint8_t 转换为 C++ 中的十六进制数字字符串

问题描述

我得到了以下我不完全理解的代码。我想做同样的事情,但不改变字节序。有人可以解释一下这段代码是如何工作的以及我如何重写它,这样字节序就不会改变吗?

// Convert N little-endian 32 integers in FROM into TO as string of hex digits.
static uint8_t*
swap32_to_ascii(const uint8_t* from, uint8_t* to, int n)
{
  hydb_assert((n & 3) == 0);

  for (int i = 0; i < n; ++i)
    {
      uint8_t ch = from[i ^ 3];
      *to++ = tohex(ch >> 4);
      *to++ = tohex(ch & 0xf);
    }

  return to;
}

// Convert a nibble NIB to a hex digit.
static int
tohex(int nib)
{
  if (nib < 10)
    return '0' + nib;
  else
    return 'a' + nib - 10;
}

标签: c++c

解决方案


关键点是ch = from[i ^ 3]行:这将恢复索引的最后两位,从 3 倒数到 0。所以索引将是3, 2, 1, 0, 7, 6, 5, 4...</p>

正如Ken YN所建议的那样,使用ch = from[i]足以交换字节序。

在您的代码中,未设置结果字符串的空终止符*to = '\0';,因此您需要在返回之前添加。

作为防御性编程,在tohex()函数中请务必限制nib为 4 位,(nib & 0xf)在最后一行使用。


推荐阅读