将以太网地址转换为可读forms?

struct ethernet_header { u_char ether_dhost[ ETHER_ADDR_LEN]; u_char ether_shost[ETHER_ADDR_LEN]; u_short ether_type; }; for(i = 0;i ether_dhost); 

如何在每个字节后以适当的可读forms打印以太网地址? 我得到的o / p是hex的。 这里Ethernet是指向ethernet_header结构的指针。

这样的事情应该这样做:

 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地址通常为以太网格式化的方式。

怎么样:

 printf("%02x:%02x:%02x:%02x:%02x:%02x", (unsigned)ethernet->ether_dhost[0], (unsigned)ethernet->ether_dhost[1], (unsigned)ethernet->ether_dhost[2], (unsigned)ethernet->ether_dhost[3], (unsigned)ethernet->ether_dhost[4], (unsigned)ethernet->ether_dhost[5]); 

我认为最好的方法是使用ether_ntoa(),它几乎可用于任何* nix操作系统(在net / ethernet.h中可用)。 以下对我来说效果很好。

 char *addr; struct ether_addr host; memcpy(&host, ethernet->ether_dhost, sizeof(host)); addr = ether_ntoa(&host);