Что-то вроде этого должно сделать это:
char mac[6 * 2 + 5 + 1];
for(size_t i = 0, pos = 0; i < sizeof ethernet->ether_dhost; i++)
{
if(i > 0)
mac[pos++] = ':';
sprintf(mac + pos, "%02x", (unsigned int) ethernet->ether_dhost[i] & 0xffu);
}
Это также вставляет двоеточия между каждым байтом, поэтому вывод будет выглядеть как DE:AD:BE:EF:BA:BE
, как обычно MAC-адреса форматируются для Ethernet.