Conversion of Ethernet address to readable form?

前端 未结 3 557
鱼传尺愫
鱼传尺愫 2021-01-27 03:33
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(         


        
相关标签:
3条回答
  • 2021-01-27 03:43

    How about:

    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]);
    
    0 讨论(0)
  • 2021-01-27 03:48

    Something like this should do it:

    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);
    }
    

    This also inserts colons between each byte, so the output will look like DE:AD:BE:EF:BA:BE which is how MAC addresses are commonly formatted for Ethernet.

    0 讨论(0)
  • 2021-01-27 03:54

    I think the best way would be to use ether_ntoa() which is available on just about any *nix operating system (available in net/ethernet.h). The following works quite well for me.

    char *addr;
    struct ether_addr host;
    
    memcpy(&host, ethernet->ether_dhost, sizeof(host));
    addr = ether_ntoa(&host);
    
    0 讨论(0)
提交回复
热议问题