打印char数组的十六进制表示[]

MCP*_*MCP 11 c hex

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

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

0x9a, 0x43, 0x0D

Kei*_*son 16

这个:

printf("%x", array);
Run Code Online (Sandbox Code Playgroud)

很可能会以十六进制的形式打印数组第一个元素的地址.我说"最有可能",因为尝试打印地址的行为就像是一个unsigned int未定义的行为.如果你真的想打印地址,那么正确的方法是:

printf("%p", (void*)array);
Run Code Online (Sandbox Code Playgroud)

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

如果要打印阵列的每个元素,则必须明确地这样做.的"%s"格式需要一个指针为一个字符串的第一个字符,并告诉printf遍历串,打印每一个字符.没有格式以十六进制的方式执行此类操作,因此您必须自己完成.

例如,给定:

unsigned char arr[8];
Run Code Online (Sandbox Code Playgroud)

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

printf("0x%x", arr[5]);
Run Code Online (Sandbox Code Playgroud)

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

printf("0x%02x", arr[5]);
Run Code Online (Sandbox Code Playgroud)

"%x"格式需要的unsigned int参数,以及unsigned char你传递值隐含晋升unsigned int,所以这是类型正确的.您可以使用"%x"打印的十六进制数字a,通过f较低的情况下,"%X"为大写(您同时使用在你的例子).

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

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


And*_*ndy 5

这就是我所做的,通过一个函数,它稍微容易一些,并且用于调试和记录内存。

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");
}
Run Code Online (Sandbox Code Playgroud)