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 <6; i++)
printf("dest ether:%x",ethernet->ether_dhost);
如何在每个字节后以适当的可读形式打印以太网地址?我得到的o / p是十六进制的。这里以太网是指向结构ethernet_header
的指针。
答案 0 :(得分:5)
怎么样:
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]);
答案 1 :(得分:5)
我认为最好的方法是使用ether_ntoa(),它几乎可用于任何* nix操作系统(在net / ethernet.h中可用)。以下对我来说效果很好。
char *addr;
struct ether_addr host;
memcpy(&host, ethernet->ether_dhost, sizeof(host));
addr = ether_ntoa(&host);
答案 2 :(得分:3)
这样的事情应该这样做:
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地址通常为以太网格式化的方式。