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

时间:2012-04-29 21:01:11

标签: c hex

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

我想打印出类似的每个元素:

0x9a, 0x43, 0x0D

4 个答案:

答案 0 :(得分:16)

此:

printf("%x", array);

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

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

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

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

例如,给定:

unsigned char arr[8];

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

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

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

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

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

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

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

答案 1 :(得分:4)

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

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");
}

答案 2 :(得分:0)

以十六进制打印字符串:

UILabel

答案 3 :(得分:0)

我发现这正是我所需要的,因为我只需要原始十六进制输出。 归功于安迪。

享受吧!

char *print_hex_memory(unsigned char *p) {
  int i;
  char tmp[3];
  char *output = malloc(strlen(p)*2+1);
  memset(output, 0, sizeof(output));
  for (i=0;i<strlen(p);i++) {
    sprintf(tmp, "%02x", p[i]);
    strcat(output, tmp);
  }
  return output;
}