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

10

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

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

0x9a, 0x43, 0x0D, так далее.

Сделайте ваш тип массиваunsigned char [] скорее, чемchar []. R..
stackoverflow.com/questions/6357031/… Ciro Santilli 新疆改造中心 六四事件 法轮功

Ваш Ответ

2   ответа
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");
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
16

Это:

printf("%x", array);

скорее всего, распечатаетaddress первого элемента вашего массива в шестнадцатеричном формате. Я говорю «скорее всего» потому что поведение попытки напечатать адрес, как если бы это было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 ценность, которую вы передаете, неявноpromoted вunsigned int, так что это типо-правильный. Ты можешь использовать"%x" распечатать шестнадцатеричные цифрыa черезf в нижнем регистре,"%X" для верхнего регистра (вы использовали оба в вашем примере).

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

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

Похожие вопросы