13

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

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

0x9a, 0x43, 0x0D, ETC。

4

4 回答 4

19

这:

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"

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

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

于 2012-04-29T21:15:21.423 回答
7

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

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");
}
于 2014-06-12T16:42:31.727 回答
2

以十六进制打印字符串:

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
于 2019-04-10T09:12:47.423 回答
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;
}
于 2021-02-13T17:37:13.417 回答