C разобрать dec в hex и вывести как char[]

Мне нужна помощь, пожалуйста. Я ищу, чтобы изменить функцию DecToHex.

Для ввода decimalNumber = 7:

Фактический вывод:

sizeToReturn = 2;
hexadecimalNumber[1] = 7;
hexadecimalNumber[0] = N/A ( is garbage );

Желаемый результат:

sizeToReturn = 3
hexadecimalNumber[2] = 0
hexadecimalNumber[1] = 7
hexadecimalNumber[0] = N/A ( is garbage )

Функция:

void DecToHex(int decimalNumber, int *sizeToReturn, char* hexadecimalNumber)
{
    int quotient;
    int i = 1, temp;
    quotient = decimalNumber;
    while (quotient != 0) {
        temp = quotient % 16;
        //To convert integer into character
        if (temp < 10)
            temp = temp + 48; else
            temp = temp + 55;
        hexadecimalNumber[i++] = temp;
        quotient = quotient / 16;
    }

    (*sizeToReturn) = i;
}

Это добавит каждый u8 к массиву:

for (int k = size - 1;k > 0;k--)
        AppendChar(Str_pst, toAppend[k]);

1 ответ

Решение

Вы действительно близко, вы можете повернуть в массив и добавить '0' к началу без особых усилий, или вы можете оставить все как есть и позаботиться об этом в основном. Я думаю, что ты получаешь ранение вокруг оси в указателе hexadecimalNumber в вашей функции. В то время как 7 производит одну шестнадцатеричную цифру, она должна быть с нулевым индексом в hexadecimalNumber (кроме инициализации i = 1Это создает путаницу при обработке вашего преобразования в строковые индексы. Просто держите индексы прямо, инициализируя i = 0 и используя hexadecimalNumber инициализируется всеми нулями, если у вас есть только один символ в индексе 1дополнить строку 0 в начале.

Вот краткий пример, который может помочь:

#include <stdio.h>
#include <stdlib.h>

#define NCHR 32

void d2h (int n, char *hex)
{
    int idx = 0, ridx = 0;      /* index & reversal index */
    char revhex[NCHR] = "";     /* buf holding hex in reverse */

    while (n) {
        int tmp = n % 16;
        if (tmp < 10)
            tmp += '0';
        else
            tmp += '7';
        revhex[idx++] = tmp;
        n /= 16;
    }
    if (idx == 1) idx++;        /* handle the zero pad on 1-char */

    while (idx--) { /* reverse & '0' pad result */
        hex[idx] = revhex[ridx] ? revhex[ridx] : '0';
        ridx++;
    }
}

int main (int argc, char **argv) {

    int n = argc > 1 ? atoi (argv[1]) : 7;
    char hbuf[NCHR] = "";

    d2h (n, hbuf);

    printf ("int : %d\nhex : 0x%s\n", n, hbuf);

    return 0;
}

0x префикс является лишь частью форматированного вывода выше.

Пример использования / Вывод

$ ./bin/h2d
int : 7
hex : 0x07

$ ./bin/h2d 26
int : 26
hex : 0x1A

$ ./bin/h2d 57005
int : 57005
hex : 0xDEAD

Если вы хотите обработать обращение в main() так что вы можете нажать на 0x07 если число символов возвращается в hexadecimalNumber меньше двух, то вы можете сделать что-то похожее на следующее:

void d2h (int n, int *sz, char *hex)
{
    int idx = 0;
    while (n) {
        int tmp = n % 16;
        if (tmp < 10)
            tmp += '0';
        else
            tmp += '7';
        hex[idx++] = tmp;
        n /= 16;
    }
    *sz = idx;
}

int main (int argc, char **argv) {

    int n = argc > 1 ? atoi (argv[1]) : 7, sz = 0;
    char hbuf[NCHR] = "";

    d2h (n, &sz, hbuf);

    printf ("int : %d\nhex : 0x", n);
    if (sz < 2)
        putchar ('0');
    while (sz--)
        putchar (hbuf[sz]);
    putchar ('\n');

    return 0;
}

Выход такой же

Посмотрите и дайте мне знать, если у вас есть дополнительные вопросы.

Другие вопросы по тегам