c++ - 将 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;
}
解决方案
关键点是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)
在最后一行使用。
推荐阅读
- c# - 如何使用类型变量使用 Dapper 进行查询
- netlogo - 对链接、self 和 end2 语法的困惑
- javascript - 有没有办法限制使用 sequelize select 查询返回的小数位数?
- java - 哪个更好地使用带有单例对象的函数或带有类的静态函数
- mysql - Mysql Kubernetes Deployment helm chart 失败,准备就绪,liveness probe failed
- wordpress - 在 Wordpress 循环中显示帖子的类别
- database - 如何将数据模型转换为全新的数据模型?
- python - 根据行中的轴计算斜率
- c# - 在 Serenity .NET 5 中访问静态 ISqlConnections
- vba - 每 15 分钟复制一行