C - 将十六进制字符串转换为 Int(所有 8 位)
C - Convert Hex String to Int (with all 8 bits)
我正在尝试将十六进制字符串转换为 int(仍然是十六进制)。我有它的工作,但有一个问题。如果我输入字符串“00000001”,结果是 0x1。但是,我的函数需要 1 之前的完整 8 位值。如何做到这一点?
我确实在 Whosebug 上看到了一个示例 here,但它适用于 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
)。
你为什么不直接使用 sscanf
(不要与 scanf
混淆)
它需要输入字符串、格式字符串和输出:
int size;
char buffer[30];
/*...*/
sscanf(buffer, "0x%x", &size);
sscanf 信息here
正在格式化here
I get from the printf a value of 0x1 (but I want it as 0x00000001).
如果您想显示一个使用 8 位数字的值,请指定最小字段宽度修饰符并指定 0
用零填充字段。
printf("%08X", memory_address);
您可以在 https://en.cppreference.com/w/c/io/fprintf 阅读更多内容。
注意0x1
和0x00000001
是完全相同的数字,表示的方式不同
注意:int
至少有 16位,可能小于32位,strtoul
returns一个unsigned long
。要打印 unsigned long
,请使用 %lX
格式说明符。
我正在尝试将十六进制字符串转换为 int(仍然是十六进制)。我有它的工作,但有一个问题。如果我输入字符串“00000001”,结果是 0x1。但是,我的函数需要 1 之前的完整 8 位值。如何做到这一点?
我确实在 Whosebug 上看到了一个示例 here,但它适用于 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
)。
你为什么不直接使用 sscanf
(不要与 scanf
混淆)
它需要输入字符串、格式字符串和输出:
int size;
char buffer[30];
/*...*/
sscanf(buffer, "0x%x", &size);
sscanf 信息here
正在格式化here
I get from the printf a value of 0x1 (but I want it as 0x00000001).
如果您想显示一个使用 8 位数字的值,请指定最小字段宽度修饰符并指定 0
用零填充字段。
printf("%08X", memory_address);
您可以在 https://en.cppreference.com/w/c/io/fprintf 阅读更多内容。
注意0x1
和0x00000001
是完全相同的数字,表示的方式不同
注意:int
至少有 16位,可能小于32位,strtoul
returns一个unsigned long
。要打印 unsigned long
,请使用 %lX
格式说明符。