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

问题描述 投票:10回答:3

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

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

0x9a, 0x43, 0x0D

c hex
3个回答
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"格式效果最佳;这不能保证,但在您可能使用的任何系统上几乎可以肯定。)

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


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

1
投票

以十六进制打印字符串:

void print_hex(const char *string)
{
        unsigned char *p = (unsigned char *) string;

        for (int i=0; i < strlen(string); ++i) {
                if (! (i % 16) && i)
                        printf("\n");

                printf("0x%02x ", p[i]);
        }
        printf("\n\n");
}

char *umlauts = "1 ä ö ü  Ä Ö Ü  é É  ß € 2";

print_hex(umlauts);

0x31 0x20 0xc3 0xa4 0x20 0xc3 0xb6 0x20 0xc3 0xbc 0x20 0x20 0xc3 0x84
0x20 0xc3 0x96 0x20 0xc3 0x9c 0x20 0x20 0xc3 0xa9 0x20 0xc3 0x89 0x20
0x20 0xc3 0x9f 0x20 0xe2 0x82 0xac 0x20 0x32
© www.soinside.com 2019 - 2024. All rights reserved.