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 阅读更多内容。

注意0x10x00000001是完全相同的数字,表示的方式不同

注意:int至少有 16位,可能小于32位,strtoul returns一个unsigned long。要打印 unsigned long,请使用 %lX 格式说明符。