Печать шестнадцатеричного представления массива char []

У меня есть массив из 8 байтов, который я пытаюсь распечатать шестнадцатеричную нотацию. Используя printf("%x", array), я могу получить первый байт и распечатать его, но я получаю "0xffffff9b" или что-то в этом роде. Есть ли способ получить обозначение без "f"?

Я хотел бы распечатать каждый элемент, выглядящий примерно так:

0x9a, 0x43, 0x0D и т.д.

Ответ 1

Это:

printf("%x", array);

скорее всего напечатает адрес первого элемента вашего массива в шестнадцатеричном формате. Я говорю "скорее всего", потому что поведение попытки напечатать адрес, как если бы оно было unsigned int, было undefined. Если вы действительно хотите распечатать адрес, правильным способом сделать это будет:

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

(В большинстве контекстов выражение массива неявно преобразуется в ( "decays" to) указатель на первый элемент массива.)

Если вы хотите напечатать каждый элемент вашего массива, вам нужно будет сделать это явно. Формат "%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" для печати шестнадцатеричных цифр a через f в нижнем регистре, "%x" для верхнего регистра (вы использовали оба в вашем примере).

(Обратите внимание, что формат "0x%02x" лучше всего работает, если байты составляют 8 бит, что не гарантируется, но это почти наверняка относится к любой системе, которую вы, вероятно, будете использовать.)

Я оставлю это вам, чтобы написать соответствующий цикл и решить, как разграничить вывод.

Ответ 2

Это то, что я сделал, его немного проще с функцией, и я использую для отладки и записи в память.

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

Ответ 3

Вывести строку в шестнадцатеричном виде:

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(uml);

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