Преобразование адреса Ethernet в читаемую форму? - PullRequest
1 голос
/ 24 ноября 2010
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);

Как напечатать адрес Ethernet в правильной читаемой форме с пробелами после каждого байта? О / р я получаю в шестнадцатеричном виде. Здесь Ethernet - указатель на структуру ethernet_header.

Ответы [ 3 ]

5 голосов
/ 24 ноября 2010

Как насчет:

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]);
5 голосов
/ 16 апреля 2011

Я думаю, что лучшим способом было бы использовать ether_ntoa (), который доступен практически на любой операционной системе * nix (доступной в net / ethernet.h). Следующее работает довольно хорошо для меня.

char *addr;
struct ether_addr host;

memcpy(&host, ethernet->ether_dhost, sizeof(host));
addr = ether_ntoa(&host);
3 голосов
/ 24 ноября 2010

Что-то вроде этого должно сделать это:

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-адреса форматируются для Ethernet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...