Чтобы сделать это вручную, проще всего иметь таблицу, сопоставляющую nybbles с ASCII:
static const char nybble_chars[] = "0123456789ABCDEF";
Затем, чтобы преобразовать байт в 2 шестнадцатеричных символа - при условии, что unsigned char
является лучшим представлением для байта, но не делая предположений о его размере - извлеките каждый кусок и получите для него символ:
void get_byte_hex( unsigned char b, char *ch1, char *ch2 ) {
*ch1 = nybble_chars[ ( b >> 4 ) & 0x0F ];
*ch2 = nybble_chars[ b & 0x0F ];
}
Это прямо распространяется на более широкие типы данных и должно генерировать достаточно сжатый код для широкого спектра архитектур.