【发布时间】:2010-08-12 01:48:54
【问题描述】:
如何在 C 中将整数转换为十六进制字符串?
示例:整数 50 将转换为十六进制字符串 "32" 或 "0x32"。
【问题讨论】:
标签: c
如何在 C 中将整数转换为十六进制字符串?
示例:整数 50 将转换为十六进制字符串 "32" 或 "0x32"。
【问题讨论】:
标签: c
这段代码
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
【讨论】:
# 修饰符而不是编写自己的0x,尤其是%p,其行为由实现定义并且可能已经包含0x。跨度>
snprintf。
#,当值为 0 时,"0x" 不会预先添加。printf("%#X\n", 0); --> 0。 IMO,printf("0x%X\n", a); 是值得的,保持 x 为小写,A-F 为大写。 0x559E7C4
以下代码采用 integer 并以十六进制格式从中生成 string:
int num = 32424;
char hex[5];
sprintf(hex, "%x", num);
puts(hex);
给予
7ea8
【讨论】:
通常使用printf(或其表亲之一)使用%x 格式说明符。
【讨论】:
strtol 的签名或手册页链接。
%X 进行大写输出。
有趣的是,这些答案使用printf,就像它是给定的一样。
printf 将整数转换为十六进制字符串值。
//*************************************************************
// 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;
}
【讨论】:
num 变量
num 替换为 n 才能使此脚本正常工作。
我做了一个库来进行十六进制/十进制转换,而不使用stdio.h。使用非常简单:
char* dechex (int dec);
这将使用calloc()来返回一个指向十六进制字符串的指针,这样使用的内存量得到了优化,所以不要忘记使用free()
这里是github上的链接:https://github.com/kevmuret/libhex/
【讨论】:
将整数转换为字符串还涉及char数组或内存管理。
为了处理这种短数组的那部分,代码可以使用 复合文字,从 C99 开始,创建数组空间,on the fly。 字符串在块结束前有效。
#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
【讨论】:
此答案适用于那些需要以十进制表示形式从string 开始(而不是从int)开始的人。
int atoi( const char * str ); 函数sprintf 函数,将 %x 作为格式参数,将整数作为值参数这是一个工作示例: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;
}
【讨论】: