我在 C 类中有这部分代码:
int i;
for (i=0;i<val;i++)
mdl_print ("%u ", rec->payload[i]);
mdl_print ("\n");
变量 rec->payload 是 uint8_t 类型。我会以十六进制表示法打印它。
我能怎么做?谢谢。
快捷方便:
print("%x", (int)(rec->payload[i]));
要以 0x05 格式显示,请使用:
print("0x%02x", ...)
反而。
如果 mdl_print() 像标准 C 函数 printf() 一样工作,请尝试以下操作:
printf( "%02x", (int) rec->payload[i] );
以十六进制编写的基本 printf 格式化代码是 %x。“02”表示用“0”填充数字,直到它有两个字符宽,这就是您通常打印 int8 的方式。
许多自定义输出函数都以这种方式遵循 printf 的格式,因为 C 程序员非常熟悉它。您可以在其手册页上阅读有关 printf 的更多信息:http: //linux.die.net/man/3/printf
使用“%x”,所以:
mdl_print ("%x", rec->payload[i]);
这会给你一个十六进制数,它是“必要的长度”。如果您想要一个固定长度,请使用“%02x”作为用零填充的两位数字。
请注意,在 printf 中提供 a uint8_t
or int
where anunsigned int
是未定义的行为,如 n1570.pdf 的第 7.21.6.1p9 节所述:“如果任何参数不是相应转换规范的正确类型,则行为未定义。” 根据 7.21.6.1p8,%x
告诉 printf 期待一个unsigned int
. 确保您明确地将您的uint8_t
转换为(unsigned int)
,或使用在PRIx8
中找到的宏<stdint.h>
。
#include <assert.h>
#include <stdint.h>
#include <stdio.h>
int main(void) {
uint8_t foo = 42;
/* These two printfs are equivalent: */
printf("Hex for %02u: %02x\n", (unsigned int) foo, (unsigned int) foo);
printf("Hex for %02" PRIu8 ": %02" PRIx8 "\n", foo, foo);
return 0;
}
首先你的标题是错误的......Casting integer to hex in C
铸造意味着类型改变,十六进制是一个数字系统而不是一个类型。您“以十六进制显示整数”而不是“强制转换”。如果您不理解其中的区别,请要求澄清。
就显示而言,这取决于您希望结果的样子。我通常使用的一种捷径是:
mdl_print("%#x ", rec->payload[i]);
将值显示为:
0xA6
这种语法的警告是它不适用于 0,你不会得到0x0
. 0
所以另一种选择是:
mdl_print("0x%x ", rec->payload[i]);
这会将值显示为0xA6
或0x0
或任何可能的值。当然,如果你不想要这个0x
部分,你总是可以这样做:
mdl_print("%x ", rec->payload[i]);
带有无符号 8 位数字的最大值(十六进制)是0xFF
这样的,如果您希望它们都显示相同的“宽度”,您也可以使用大小说明符:
mdl_print("%02x ", rec->payload[i]); // or mdl_print("0x%02x, rec->payload[i]);
// or whatever you picked