Существует ли общий способ или хороший общедоступный код для преобразования двоичного кода (т. е. массива байтов или блока памяти) в шестнадцатеричную строку? У меня есть несколько приложений, которые обрабатывают ключи шифрования и контрольные суммы, и мне нужно часто использовать эту функцию. Я написал свое собственное «быстрое и грязное» решение для этого, но оно работает только с двоичными объектами фиксированного размера, и я ищу что-то более универсальное. Это кажется довольно обыденной задачей, и я уверен, что для этого должен быть какой-то код или библиотеки. Может ли кто-нибудь указать мне правильное направление, пожалуйста?
Как преобразовать двоичную в шестнадцатеричную строку в C/glib?
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
Да, это выглядит правильно. Позвольте мне попробовать. По сути, я хочу, чтобы функция возвращала строку, но это хорошая отправная точка. Спасибо.
- person dtoux; 22.09.2011
Используя sprintf, strcat и их друзей, должно быть тривиально расширить это для вывода в строковый буфер. Удачи!
- person harald; 22.09.2011
В GLib есть
g_strdup_printf()
, который выделяет для вас строковый буфер подходящего размера. Может быть полезно.
- person ptomato; 22.09.2011
Это правда, однако, поскольку блок данных данных имеет переменный размер и поэтому будет выходной строкой, я, скорее всего, сам выделю память, а затем просто использую
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
Зачем использовать менее переносимые функции и типы glib? Здесь нет ничего, что нельзя было бы сделать с помощью стандартного C.
- person harald; 23.09.2011
@harald: я понимаю вашу точку зрения, и она полностью верна. Короткий ответ - для согласованности. Эта функция войдет в служебную библиотеку, а большинство других функций специфичны для glib, поэтому наша политика в таких случаях заключается в использовании во всей библиотеке только типов glib.
- person dtoux; 24.09.2011
это вполне уважительная причина :)
- person harald; 24.09.2011