如何在C中将整数转换为hex字符串?

如何在C中将整数转换为hex字符串?

示例:整数50将转换为hex字符串"32""0x32"

这段代码

 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,则将hex值大写:

 int a = 89778116; printf("%X\n", a); 

版画

 559E7C4 

如果要打印指针,请使用p格式说明符:

 char* str = "foo"; printf("0x%p\n", str); 

版画

 0x01275744 

通常使用%x格式说明符的printf (或其中一个表兄弟)。

以下代码采用整数forms,并以hex格式生成一个字符串

 int num = 32424; char hex[5]; sprintf(hex, "%x", num); puts(hex); 

 7ea8 

有趣的是,这些答案使用printf就像是给定的。 printf将整数转换为hex字符串值。

 //************************************************************* // 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; } 

我做了一个librairy来进行hex/十进制转换而不使用stdio.h 。 使用非常简单:

 char* dechex (int dec); 

这将使用calloc()来返回指向hex字符串的指针,这样就可以优化使用的内存量,所以不要忘记使用free()

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

将整数转换为字符串还涉及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 vvv 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