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;
}
Выход такой же
Посмотрите и дайте мне знать, если у вас есть дополнительные вопросы.