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

时间:2010-11-24 09:05:29

标签: c

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的指针。

3 个答案:

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