c-在不使用sprintf的情况下将无符号int转换为十六进制字符串



我正在尝试实现以下内容(没有sprintf或格式化(:

void integer_to_string(unsigned int a, char *string)
{
char arr[16] = "0123456789abcdef";
char *p = (char *)&a;
unsigned int i;
for (i = 0; i < 4; i++) {
unsigned char lo = p[i] & 0xf; 
unsigned char hi = p[i] >> 4;
string[i * 2] = arr[hi];
string[i * 2 + 1] = arr[lo];
}
string[2 * i] = '';
}

该程序从整数a转换为十六进制a,并将其余部分保存为字符串。因此,它应该向"0000000a"返回一个类似于10的int,但却给了我一个值"0a000000"。我做错了什么?如何将0a移到末尾而不是开头。

通过char *p = (char *)&a;访问正确的有效字节依赖于endian,在OP的情况下,顺序错误。


通过使用数学而不是强制转换来正确排序并避免端序问题:

for (i = 0; i < 8; i++) {
unsigned char ch = (a >> ((32-4) - i*4)) & 0xF; 
string[i] = arr[ch];
}
string[i] = '';

存在简化。

输出不正确,因为系统对内存中形成int值的字节使用小端序。现在这种情况很常见。将a的地址强制转换为char *会导致代码不可移植。

相反,您应该以这种方式编写不依赖于整数内部表示的可移植代码:

// convert an unsigned int to its hexadecimal representation in a string
// assuming str points to an array of at least 9 bytes
// assuming unsigned int type has 32 bits
// returns its second argument for ease of use in chained expressions
char *integer_to_string(unsigned int a, char *str) {
str[8] = '';
for (int i = 0; i < 8; i++) {
str[7 - i] = "0123456789abcdef"[a & 0xF];
a = a >> 4;
}
return str;
}

也许不是最好的,但肯定很快。。。

此函数返回一个char*,其中包含传递给它的任何32位或更少的无符号整数的HEX版本…

示例:u32tohex(284598256);将返回"0x10F69FF0"作为char*

必须在函数外部声明return char[],因为返回局部变量的指针是无效的!

char dex[11] = "0x00000000";

const char* u32tohex(uint32_t ul)
{
const char HexC[17]="0123456789ABCDEF";
for (uint8_t xh=9; xh>1; xh--)
{
dex[xh]=HexC[ul&0xf];
ul>>=4;
}
return &dex;
}

或者在没有前缀CCD_ 15的情况下相同。。。示例:u32tohex(121345243);将返回"073B94DB"作为char*

char dex[9] = "00000000";

const char* u32tohex(uint32_t ul)
{
const char HexC[17]="0123456789ABCDEF";
for (uint8_t xh=0; xh<8; xh++) 
{
dex[7-xh]=HexC[ul&0xf];
ul>>=4;
}
return &dex;
}

乍一看可能有点难以理解,但对变量的操作越少,总是会产生一个快速的函数。。。传递给函数的32位无符号整数存储在ul中,循环从char[]结果的末尾开始,然后返回。。。因为我只对ul和0xf进行逐位AND,以获得最低有效的半字节,在一个镜头中,并将最终字符设置为HexC[]。。。并将4位的ul右移,去掉最后一个半字节,并用下一个替换它。。。只有8次迭代,工作就完成了。。。为了这个目的,有一个快速功能似乎没有用,因为有一些约定,但如果你在反汇编程序中使用它,在屏幕上的每一行显示地址,以及来自这些地址的数据,与许多其他解决方案相比,在滚动屏幕时刷新的速度将非常灵敏。。。

相关内容

最新更新