如何解决不使用sprintf将unsigned 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] = '\0';
}
此程序正在从整数a转换并将a转换为十六进制并将其余的保存为字符串。因此,应该将一个类似10的整数返回给“ 0000000a”,但是却给了我一个“ 0a000000”的值。我究竟做错了什么?如何将0a移到末尾而不是开始。
解决方法
通过char *p = (char *)&a;
访问正确的有效字节取决于字节序,在OP的情况下,顺序错误。
使用数学而非强制转换来正确处理订单并避免字节序问题:
for (i = 0; i < 8; i++) {
unsigned char ch = (a >> ((32-4) - i*4)) & 0xF;
string[i] = arr[ch];
}
string[i] = '\0';
存在简化。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。