Преобразовать переменное шестнадцатеричное значение в символ * - PullRequest
1 голос
/ 14 декабря 2010

Как преобразовать значение hex в c в эквивалентное значение char*.Например, если шестнадцатеричное значение равно 1df2, char * также должен содержать 1df2.

Я использую компилятор VinC и компоновщик VinL для VNC2 USB Chip из FTDI.У него есть следующие файлы заголовков; stdlib , stdio и string .Это, однако, подмножества основных библиотек c, и они не имеют очевидных ответов, таких как snprintf или sprintf.

В документах сказано, что допустимы следующие типы:

определенные определения для переменных и типов функций, которые используются во всем ядре и драйверах.Они доступны приложениям в заголовочном файле vos.h.

Определения нулевого указателя и логики:

#define NULL                0
#define TRUE                1
#define FALSE               0

Определения типов переменных:

#define uint8               unsigned char
#define int8                char
#define int16               short
#define uint16              unsigned short
#define uint32              unsigned int
#define pvoid               unsigned char *

Определения типов функций:

typedef uint8 (*PF)(uint8);
typedef void (*PF_OPEN)(void *);
typedef void (*PF_CLOSE)(void *);
typedef uint8 (*PF_IOCTL)(pvoid);
typedef uint8 (*PF_IO)(uint8 *, unsigned short, unsigned short *);
typedef void (*PF_INT)(void);

Есть предложения?

Ответы [ 3 ]

5 голосов
/ 14 декабря 2010

Использование snprintf():

int to_hex(char *output, size_t len, unsigned n)
{    
    return snprintf(output, len, "%.4x", n);
}

Учитывая новую информацию о том, что это довольно базовая встроенная система, тогда, если вас интересует только 16-битные числа, возможно, достаточно минимального решения, подобного этому.:

/* output points to buffer of at least 5 chars */
void to_hex_16(char *output, unsigned n)
{
    static const char hex_digits[] = "0123456789abcdef";

    output[0] = hex_digits[(n >> 12) & 0xf];
    output[1] = hex_digits[(n >> 8) & 0xf];
    output[2] = hex_digits[(n >> 4) & 0xf];
    output[3] = hex_digits[n & 0xf];
    output[4] = '\0';
}

(должно быть понятно, как расширить его на более широкие числа).

0 голосов
/ 14 декабря 2010

Что-то вроде этого должно сделать это:

void to_hex(char *buffer, size_t size, unsigned n)
{
    size_t i;
    size_t j;
    char c;
    unsigned digit;

    // Print digits in the reverse order
    for (i = 0; i < size - 1; ++i)
    {
        digit = n & 0xf;
        buffer[i] = digit < 10 ? digit + '0' : digit - 10 + 'A';
        n >>= 4;

        if (n == 0)
        {
            break;
        }
    }

    // Append NUL
    buffer[i + 1] = 0;

    // Reverse the string
    for (j = 0; j < i / 2; ++j)
    {
        c = buffer[j];
        buffer[j] = buffer[i - j];
        buffer[i - j] = c;
    }
}

Но вы говорите, что у вас есть stdio, поэтому нет необходимости писать что-то подобное себе.

Редактировать: Возможно, компилятор ожидает прототип в стиле K & R:

void to_hex(buffer, size, n)
    char *buffer;
    size_t size; 
    unsigned n;
{
...

Попробуйте это на Codepad .

0 голосов
/ 14 декабря 2010

Попробуйте sprintf :

int to_hex(char *output,unsigned n)
{    
    return sprintf(output, "%.4x", n);
}

это менее безопасно, чем ответ caf, но должно работать, если у вас есть stdio.Вы должны , поэтому убедитесь, что выходной буфер достаточно большой, чтобы вместить полученную строку.

...