打印char数组的hex表示

我有一个8字节的数组,我正在尝试打印出hex表示法。 使用printf("%x", array)我可以得到第一个字节并打印出来,但我得到的是"0xffffff9b"或类似的东西。 有没有办法在没有“f”的情况下获得符号?

我想打印出每个元素看起来像:

0x9a, 0x43, 0x0D

这个:

 printf("%x", array); 

很可能会以hex的forms打印数组第一个元素的地址 。 我说“最有可能”,因为尝试打印地址的行为就好像是unsigned int是未定义的。 如果你真的想打印地址,正确的做法是:

 printf("%p", (void*)array); 

(在大多数情况下,数组表达式被隐式转换为(“衰减”)指向数组第一个元素的指针。)

如果要打印arrays的每个元素,则必须明确地这样做。 "%s"格式采用指向字符串第一个字符的指针,并告诉printf迭代字符串,打印每个字符。 没有格式以hexforms执行此类操作,因此您必须自己完成。

例如,给定:

 unsigned char arr[8]; 

你可以像这样打印元素5:

 printf("0x%x", arr[5]); 

或者,如果你想要一个前导零:

 printf("0x%02x", arr[5]); 

"%x"格式需要unsigned int参数,并且您传递的unsigned char值被隐式提升unsigned int ,因此这是类型正确的。 您可以使用"%x"以小写字母打印hex数字af ,对于大写字母打印"%X" (在您的示例中使用了两者)。

(注意,如果字节是8位, "0x%02x"格式效果最好;这不能保证,但在您可能使用的任何系统上几乎都可以。)

我将留给您编写适当的循环并决定如何分隔输出。

这就是我所做的,它使用一个函数稍微容易一点,我用它来调试和记录内存。

 void print_hex_memory(void *mem) { int i; unsigned char *p = (unsigned char *)mem; for (i=0;i<128;i++) { printf("0x%02x ", p[i]); if ((i%16==0) && i) printf("\n"); } printf("\n"); }