Как преобразовать двоичную в шестнадцатеричную строку в C/glib?

Существует ли общий способ или хороший общедоступный код для преобразования двоичного кода (т. е. массива байтов или блока памяти) в шестнадцатеричную строку? У меня есть несколько приложений, которые обрабатывают ключи шифрования и контрольные суммы, и мне нужно часто использовать эту функцию. Я написал свое собственное «быстрое и грязное» решение для этого, но оно работает только с двоичными объектами фиксированного размера, и я ищу что-то более универсальное. Это кажется довольно обыденной задачей, и я уверен, что для этого должен быть какой-то код или библиотеки. Может ли кто-нибудь указать мне правильное направление, пожалуйста?


person dtoux    schedule 22.09.2011    source источник
comment
извините за мой предыдущий неправильный ответ. Посмотрите здесь: stackoverflow.com/questions/2482211/   -  person Heisenbug    schedule 22.09.2011
comment
Это не то же самое. Под двоичным кодом я подразумеваю блок памяти, а не двоичную строку. В основном я ищу ту же функциональность, что и hexdump в Linux.   -  person dtoux    schedule 22.09.2011


Ответы (2)


Что-то вроде этого?

void print_hex(const char * buffer, size_t size)
{
    for (size_t i = 0; i < size; i++)
        printf("%02x", buffer[i]);
}
person harald    schedule 22.09.2011
comment
Да, это выглядит правильно. Позвольте мне попробовать. По сути, я хочу, чтобы функция возвращала строку, но это хорошая отправная точка. Спасибо. - person dtoux; 22.09.2011
comment
Используя sprintf, strcat и их друзей, должно быть тривиально расширить это для вывода в строковый буфер. Удачи! - person harald; 22.09.2011
comment
В GLib есть g_strdup_printf(), который выделяет для вас строковый буфер подходящего размера. Может быть полезно. - person ptomato; 22.09.2011
comment
Это правда, однако, поскольку блок данных данных имеет переменный размер и поэтому будет выходной строкой, я, скорее всего, сам выделю память, а затем просто использую g_sprintf(), чтобы заполнить ее. Код должен быть тривиальным. Спасибо всем за помощь. - person dtoux; 23.09.2011

Спасибо всем за вашу помощь. Вот как получился окончательный код в нотации glib:

gchar *
print_to_hex (gpointer buffer, gsize buffer_length) {
    gpointer ret = g_malloc (buffer_length * 2 + 1);
    gsize i;
    for (i = 0; i < buffer_length; i++) {
        g_snprintf ((gchar *) (ret + i * 2), 3, "%02x", (guint) (*((guint8 *) (buffer + i))));
    }
    return ret;
}
person dtoux    schedule 23.09.2011
comment
Зачем использовать менее переносимые функции и типы glib? Здесь нет ничего, что нельзя было бы сделать с помощью стандартного C. - person harald; 23.09.2011
comment
@harald: я понимаю вашу точку зрения, и она полностью верна. Короткий ответ - для согласованности. Эта функция войдет в служебную библиотеку, а большинство других функций специфичны для glib, поэтому наша политика в таких случаях заключается в использовании во всей библиотеке только типов glib. - person dtoux; 24.09.2011
comment
это вполне уважительная причина :) - person harald; 24.09.2011