-1

我在 C 类中有这部分代码:

int i;
    for (i=0;i<val;i++)
        mdl_print ("%u ", rec->payload[i]);
    mdl_print ("\n");

变量 rec->payload 是 uint8_t 类型。我会以十六进制表示法打印它。

我能怎么做?谢谢。

4

5 回答 5

2

快捷方便:

print("%x", (int)(rec->payload[i]));

要以 0x05 格式显示,请使用:

print("0x%02x", ...)

反而。

于 2013-03-11T11:33:17.637 回答
2

如果 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

于 2013-03-11T11:33:36.717 回答
1

使用“%x”,所以:

mdl_print ("%x", rec->payload[i]);

这会给你一个十六进制数,它是“必要的长度”。如果您想要一个固定长度,请使用“%02x”作为用零填充的两位数字。

于 2013-03-11T11:34:04.510 回答
1

请注意,在 printf 中提供 a uint8_tor intwhere 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;
}
于 2013-03-11T12:15:27.287 回答
-1

首先你的标题是错误的......Casting integer to hex in C铸造意味着类型改变,十六进制是一个数字系统而不是一个类型。您“以十六进制显示整数”而不是“强制转换”。如果您不理解其中的区别,请要求澄清。

就显示而言,这取决于您希望结果的样子。我通常使用的一种捷径是:

mdl_print("%#x ", rec->payload[i]);

将值显示为:

0xA6

这种语法的警告是它不适用于 0,你不会得到0x0. 0所以另一种选择是:

mdl_print("0x%x ", rec->payload[i]);

这会将值显示为0xA60x0或任何可能的值。当然,如果你不想要这个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
于 2013-03-11T11:49:00.140 回答