我正在尝试将十六进制字符串转换为int(仍然是十六进制(。我让它工作,但有一个问题。如果我输入字符串"0";00000001";结果是0x1。然而,我的函数需要完整的8位值,直到1。如何做到这一点?
我确实在StackOverflow上看到了一个例子,但它是针对C#的,而不是C或C++。
输入:
Enter the memory address you want to dump from (EG: 0xABC00000)
address? >> 0x00000001
serial_buffer = 00000001
memory_address = "0x1"
代码:
unsigned int memory_address = 0xABC00000;
static char serial_buffer[30]; // plenty of room
memory_address = strtoul(serial_buffer, NULL, 16); // convert it
printf("serial_buffer = %s", serial_buffer);
printf("memory_address = "0x%X" bytes", memory_address);
// this is done in a loop (not part of this example)
serial_buffer[i++] = key_code; // add char into serial_buffer
putchar(key_code); // echo back the typed char
如果我注释掉memory_address = strtoul(serial_buffer, NULL, 16);
,我将从printf
得到正确的值作为memory_address = "0xABC00000"
。
如果我把memory_address = strtoul(serial_buffer, NULL, 16);
放回,我从printf
得到一个值0x1
(但我希望它是0x00000001
(。
我从printf得到一个值0x1(但我希望它是0x00000001(。
如果要使用8位数字显示值,请指定最小字段宽度修饰符,并指定0
以用零填充字段。
printf("%08X", memory_address);
您可以在https://en.cppreference.com/w/c/io/fprintf。
请注意,0x1
和0x00000001
是完全相同的数字,以不同的方式表示。
注意:int
的至少为16位,并且可能小于32位,strtoul
返回unsigned long
。要打印unsigned long
,请使用%lX
格式说明符。
为什么不直接使用sscanf
(不要与scanf
混淆(它需要输入字符串、格式化字符串和输出:
int size;
char buffer[30];
/*...*/
sscanf(buffer, "0x%x", &size);
此处为sscanf信息
此处格式化