如何在C语言中将整数转换为十六进制字符串?

49

如何在C中将整数转换为十六进制字符串?

例子:整数50会被转换为十六进制字符串"32""0x32"

7个回答

54
这段代码
int a = 5;
printf("%x\n", a);

打印

5
这段代码
int a = 5; 
printf("0x%x\n", a);

打印

0x5
这段代码。
int a = 89778116;
printf("%x\n", a);

打印

559e7c4
如果在格式中大写字母X,则会将十六进制值大写:
int a = 89778116;
printf("%X\n", a);

打印

559E7C4
如果您想要打印指针,您需要使用%p格式说明符:
char* str = "foo";
printf("0x%p\n", str);

打印

0x01275744

3
我建议使用#修饰符代替编写自己的0x,特别是在使用%p时,其行为是实现定义的,可能已经包含了0x - R.. GitHub STOP HELPING ICE
2
也许还需要提到 snprintf - strager
1
此外,你的回答格式有些混乱,交替出现的代码块让人感到困惑。将所有代码放在一个代码块中,并在语句后用注释形式呈现结果可能更加有用。 - strager
请注意,使用时,当值为0时,不会添加前缀“ 0x”。 printf(“%#X \ n”,0);-0。 我认为,保留x为小写字母和A-F大写字母的方式,使用printf(“0x%X \ n”,a);是值得的。0x559E7C4 - chux - Reinstate Monica

24
以下代码接受一个整数并将其转换为十六进制格式的字符串:
int  num = 32424;
char hex[5];

sprintf(hex, "%x", num);
puts(hex);

提供

7ea8

20

通常使用printf(或其变种之一)并使用%x格式说明符。


您可能至少想提供strtol的签名或man页链接。 - strager
3
strtol()与他要求的相反,它走了错误的方向。 - Trade-Ideas Philip
你可以使用 %X 来输出大写字母。 - user330606

15

有趣的是这些回答将printf当作一项已知技能。 printf 将整数转换为十六进制字符串值。

有趣的是这些答案像使用基本技能一样使用了printfprintf将整数转换为十六进制字符串值。

//*************************************************************
// void prntnum(unsigned long n, int base, char sign, char *outbuf)
// unsigned long num = number to be printed
// int base        = number base for conversion;  decimal=10,hex=16
// char sign       = signed or unsigned output
// char *outbuf   = buffer to hold the output number
//*************************************************************

void prntnum(unsigned long n, int base, char sign, char *outbuf)
{

    int i = 12;
    int j = 0;

    do{
        outbuf[i] = "0123456789ABCDEF"[num % base];
        i--;
        n = num/base;
    }while( num > 0);

    if(sign != ' '){
        outbuf[0] = sign;
        ++j;
    }

    while( ++i < 13){
       outbuf[j++] = outbuf[i];
    }

    outbuf[j] = 0;

}

12
缺少“num”变量。 - albttx
1
你没有检查基数是否大于16。它至少应该在头文件中。另外,我认为你可以把符号留给调用者。 - Richard Haven
2
你必须将变量num替换为n,才能使该脚本正常工作。 - secavfr

3
我做了一个库,可以在不使用的情况下进行十六进制/十进制转换。非常简单易用:
char* dechex (int dec);

这将使用calloc()来返回一个十六进制字符串的指针,这样可以优化内存使用量,因此不要忘记使用free()释放内存。

这里是GitHub上的链接:https://github.com/kevmuret/libhex/


1
将整数转换为字符串也涉及到char数组或内存管理。
为了处理这种短数组的部分,代码可以使用复合字面量(自C99起)来创建数组空间,即时。该字符串在块结束之前有效。
#define UNS_HEX_STR_SIZE ((sizeof (unsigned)*CHAR_BIT + 3)/4 + 1)
//                         compound literal v--------------------------v
#define U2HS(x) unsigned_to_hex_string((x), (char[UNS_HEX_STR_SIZE]) {0}, UNS_HEX_STR_SIZE)

char *unsigned_to_hex_string(unsigned x, char *dest, size_t size) {
  snprintf(dest, size, "%X", x);
  return dest;
}

int main(void) {
  // 3 array are formed v               v        v
  printf("%s %s %s\n", U2HS(UINT_MAX), U2HS(0), U2HS(0x12345678));
  char *hs = U2HS(rand());
  puts(hs);
  // `hs` is valid until the end of the block
}

输出

FFFFFFFF 0 12345678
5851F42D

1
这个答案适用于那些需要从十进制表示的字符串开始(而不是从int开始)的人。
  1. 将您的数字的字符串表示转换为整数值(您可以使用 int atoi(const char * str); 函数
  2. 一旦您拥有整数,您就可以使用例如 sprintf 函数和%x 作为格式参数以及您整数作为值参数来将其打印为HEX
这里是一个工作示例: https://ideone.com/qIoHNW
#include <stdio.h>
 
int main(void) { 
    int n;
    char hex_val[50];
 
    n = atoi("100663296");
    sprintf(hex_val, "%x", n);
 
    printf("%s", hex_val);
    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接