printf () форматирование для шестнадцатеричного uint32_t без пропущенных нулей. (в c89) - PullRequest
0 голосов
/ 30 июня 2018

Хотел распечатать uint32 hex. Пробовал "PRIx32", мне плохо выглядело:

967407c0 23 4481d55f ffffff52 de3cd140
2fc aa7363cf fffff40d 563270c0 2b86

Итак ... попробовал это. Грязно, но сработало:

 /*******************************************************************************
 Print a digit in hex.
 *******************************************************************************/
 void mpal_digit_t_print_hex(
     mpal_digit_t * input)
 {
     uint8_t p_1, p_2, p_3, p_4, p_5, p_6, p_7, p_8;

     p_1 = (uint8_t)(((*input) << 0) >> 28);
     p_2 = (uint8_t)(((*input) << 4) >> 28);
     p_3 = (uint8_t)(((*input) << 8) >> 28);
     p_4 = (uint8_t)(((*input) << 12) >> 28);
     p_5 = (uint8_t)(((*input) << 16) >> 28);
     p_6 = (uint8_t)(((*input) << 20) >> 28);
     p_7 = (uint8_t)(((*input) << 24) >> 28);
     p_8 = (uint8_t)(((*input) << 28) >> 28);

     printf(" %" PRIx8 "%" PRIx8 "%" PRIx8 "%" PRIx8 "%" PRIx8 "%" PRIx8 "%"
            PRIx8 "%" PRIx8 "", p_1, p_2, p_3, p_4, p_5, p_6, p_7, p_8);
     return;
 }

Выход:

 61dd90ef ff6df47e a0a9abc0 011d7394 2311761f
 f4402427 5c44ca40 0f86aba7 6aa5194f ecb9ed1e

Есть ли элегантный способ сделать это в c?

1 Ответ

0 голосов
/ 30 июня 2018

Эти "символические" спецификаторы printf, такие как PRIx32, предназначены для использования с дополнительными флагами, если они вам нужны. Таким образом, вы можете сделать что-то вроде этого:

printf("%08" PRIx32, hexval);

После конкатенации строк это обычно превращается в %08x или %08lx. 8 указывает на то, что вы хотите (как минимум) 8 цифр, а 0 указывает на добавление 0.

...