打印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数字a
到f
,对于大写字母打印"%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"); }