将以太网地址转换为可读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);