Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不使用sprintf将无符号int转换为十六进制字符串_C_String_Integer_Hex_Unsigned - Fatal编程技术网

C 不使用sprintf将无符号int转换为十六进制字符串

C 不使用sprintf将无符号int转换为十六进制字符串,c,string,integer,hex,unsigned,C,String,Integer,Hex,Unsigned,我正在尝试实现以下内容(没有sprintf或格式): void integer_to_string(无符号int a,char*string) { 字符arr[16]=“0123456789abcdef”; char*p=(char*)&a; 无符号整数i; 对于(i=0;i>4; 字符串[i*2]=arr[hi]; 字符串[i*2+1]=arr[lo]; } 字符串[2*i]='\0'; } 此程序正在从整数a转换为十六进制,并将其余部分保存为字符串。所以,它应该返回一个整数,比如10到“0

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

void integer_to_string(无符号int a,char*string)
{
字符arr[16]=“0123456789abcdef”;
char*p=(char*)&a;
无符号整数i;
对于(i=0;i<4;i++){
无符号字符lo=p[i]&0xf;
无符号字符hi=p[i]>>4;
字符串[i*2]=arr[hi];
字符串[i*2+1]=arr[lo];
}
字符串[2*i]='\0';
}

此程序正在从整数a转换为十六进制,并将其余部分保存为字符串。所以,它应该返回一个整数,比如10到“0000000a”,但实际上它给了我一个值“0a000000”。我做错了什么?如何将0a移到末尾而不是开头。

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


通过使用数学,而不是强制转换,获得正确的顺序并避免endian ness问题:

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

存在简化。

看起来您的系统正在对整数使用小尾端字节顺序。您需要以相反的顺序遍历该值的字节,或者从右边开始在字符串中写入字节。选择一个。对于一个不依赖于了解系统的端点的解决方案,您可以使用位移位和掩蔽来实现同样的效果。
char*p=(char*)&a
这是不可移植的,因为
p
指向的int字节取决于平台。您的平台似乎是little endian,因此
p
从最低字节地址开始。最好在整个int上使用移位和掩码。还有一个问题:在进行位旋转时,始终使用无符号类型。该标准未指定
char
是有符号还是无符号。如果它是有符号的(x86!),那么
p[i]>>4
可以是算术符号扩展移位,您会得到一些不太正确的结果。如果您使用的是x86,请尝试将255转换为十六进制或更好,使用CHAR_BIT+sizeof
for (i = 0; i < 8; i++) {
    unsigned char ch = (a >> ((32-4) - i*4)) & 0xF; 
    string[i] = arr[ch];
}
string[i] = '\0';