Как я могу преобразовать целое число в шестнадцатеричную строку в C? - PullRequest
28 голосов
/ 12 августа 2010

Как я могу преобразовать целое число в шестнадцатеричную строку в C?

Пример: целое число 50 будет преобразовано в шестнадцатеричную строку "32" или "0x32".

Ответы [ 6 ]

37 голосов
/ 12 августа 2010

Этот код

int a = 5;
printf("%x\n", a);

печатает

5

Этот код

int a = 5; 
printf("0x%x\n", a);

печатает

0x5

Этот код

int a = 89778116;
printf("%x\n", a);

печатает

559e7c4

Если вы используете заглавную букву x в формате, то заглавным становится шестнадцатеричное значение:

int a = 89778116;
printf("%X\n", a);

печатается

559E7C4

Если вы хотите печатать указатели, вы используете спецификатор формата p:

char* str = "foo";
printf("0x%p\n", str);

печатает

0x01275744
18 голосов
/ 12 августа 2010

Обычно с printf (или одним из его двоюродных братьев) с использованием спецификатора формата %x.

17 голосов
/ 20 октября 2013

Следующий код принимает целое число и делает из него строку в шестнадцатеричном формате:

int  num = 32424;
char hex[5];

sprintf(hex, "%x", num);
puts(hex);

дает

7ea8
9 голосов
/ 01 мая 2016

Интересно, что эти ответы используют printf как данность. printf преобразует целое число в шестнадцатеричное строковое значение.

//*************************************************************
// void prntnum(unsigned long n, int base, char sign, char *outbuf)
// unsigned long num = number to be printed
// int base        = number base for conversion;  decimal=10,hex=16
// char sign       = signed or unsigned output
// char *outbuf   = buffer to hold the output number
//*************************************************************

void prntnum(unsigned long n, int base, char sign, char *outbuf)
{

    int i = 12;
    int j = 0;

    do{
        outbuf[i] = "0123456789ABCDEF"[num % base];
        i--;
        n = num/base;
    }while( num > 0);

    if(sign != ' '){
        outbuf[0] = sign;
        ++j;
    }

    while( ++i < 13){
       outbuf[j++] = outbuf[i];
    }

    outbuf[j] = 0;

}
3 голосов
/ 03 мая 2014

Я сделал библиотеку, чтобы сделать шестнадцатеричное / десятичное преобразование без использования stdio.h.Очень прост в использовании:

char* dechex (int dec);

. Он будет использовать calloc() для возврата указателя на шестнадцатеричную строку, таким образом, количество используемой памяти оптимизируется, поэтому не забывайте использовать free()

Вот ссылка на github: https://github.com/kevmuret/libhex/

1 голос
/ 15 июня 2017

Для преобразования целого числа в строку также требуется char управление массивом или памятью.

Для обработки этой части для таких коротких массивов код может использовать составной литерал , начиная с C99, для создания пространства массива на лету . строка действительна до конца блока.

#define UNS_HEX_STR_SIZE ((sizeof (unsigned)*CHAR_BIT + 3)/4 + 1)
//                         compound literal v--------------------------v
#define U2HS(x) unsigned_to_hex_string((x), (char[UNS_HEX_STR_SIZE]) {0}, UNS_HEX_STR_SIZE)

char *unsigned_to_hex_string(unsigned x, char *dest, size_t size) {
  snprintf(dest, size, "%X", x);
  return dest;
}

int main(void) {
  // 3 array are formed v               v        v
  printf("%s %s %s\n", U2HS(UINT_MAX), U2HS(0), U2HS(0x12345678));
  char *hs = U2HS(rand());
  puts(hs);
  // `hs` is valid until the end of the block
}

выход

FFFFFFFF 0 12345678
5851F42D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...