GLib API для преобразования шестнадцатеричной строки в строку ASCII?

Я не могу поверить, что в GLib нет API для этого, пока я нашел только людей, которые делают собственное преобразование, например здесь и здесь (функция с именем "расшифровать"). Мне бы очень хотелось найти способ сделать это с помощью простого вызова GLib, но если нет, то вышеуказанные методы мне не подходят, потому что первый — это C++ (я использую C/GObject), а второй не работает идеально (у меня проблемы с длиной результата).

ТИА


person knocte    schedule 14.08.2011    source источник
comment
Не могли бы вы уточнить, что это не работает идеально (у меня проблемы с длиной результата)?   -  person glglgl    schedule 15.08.2011
comment
Вы работаете исходя из предположения, что это обычная задача. Это не так, пользователи вашей программы обычно не умеют вводить шестнадцатеричные строки. Двоичный код в шестнадцатеричный встречается немного чаще, ваш отладчик знает, как это сделать. Немного отойдите от машины.   -  person Hans Passant    schedule 15.08.2011


Ответы (2)


Как уже упоминалось, это немного необычно. Если у вас достаточно короткая шестнадцатеричная строка, вы можете добавить к ней префикс 0x и использовать strtoll(). Но для строк произвольной длины вот функция C:

char *hex_to_string(const char *input)
{
    char a;
    size_t i, len;
    char *retval = NULL;
    if (!input) return NULL;

    if((len = strlen(input)) & 1) return NULL;

    retval = (char*) malloc(len >> 1);
    for ( i = 0; i < len; i ++)
    {
        a = toupper(input[i]);
        if (!isxdigit(a)) break;
        if (isdigit(a)) a -= '0';
        else a = a - 'A' + '\10';

        if (i & 1) retval[i >> 1] |= a;
        else retval[i >> 1] = a<<4;
    }
    if (i < len)
    {
        free(retval);
        retval = NULL;
    }

    return retval;
}
person Seth    schedule 23.09.2011
comment
retval не может заканчиваться нулевым символом, а затем не указывает на строку. - person chux - Reinstate Monica; 30.03.2016

Я не уверен на 100%, что вы подразумеваете под «шестнадцатеричной строкой», но может быть эта тема будет полезна.

person dtoux    schedule 26.09.2011