打印MAC地址的问题

问题描述:

MAC地址被解析为一个字节数组(macaddr)。字节 一个接一个地印有printf()。字节应该看起来像是 对的十六进制字符。但其中一些填充了f 个字符。打印MAC地址的问题

例如,对于macaddr[3],它打印'ffffffcc'而不是'cc',即 4字节而不是单字节。该阵列其余条目的正确打印 (macaddr[0] = 00macaddr[1] = AAmacaddr[2] = BB, 等)

什么问题? 请帮我弄清楚程序有什么问题。

#include <stdio.h> 
#include <net/if.h> // struct ifconf 
#include <errno.h> 
#include <libnet.h> 
#include <pcap.h> 
#include <stdlib.h> 
#include <unistd.h> 

int getmacaddr() ; 

int main(int argc, char *argv[]) 
{ 
    getmacaddr();  
} 

int getmacaddr() 
{ 
    struct ifconf ifc; 
    struct ifreq *ifr; 
    int sfd; 
    int i; 
    int devnums; 
    char macaddr[ETHER_ADDR_LEN]; 

    ifc.ifc_req = NULL; 

    sfd = socket(AF_INET,SOCK_DGRAM,0); 
    if(sfd == -1) 
    { 
     perror("socket : "); 
     return -1; 
    } 

    // get ifc.ifc_len 
    if(ioctl(sfd,SIOCGIFCONF,&ifc) == -1) 
    { 
     perror("ioctl - SIOCGIFCONF : "); 
     return -1; 
    } 
    devnums = ifc.ifc_len/sizeof(struct ifreq); 

    // malloc ifc.ifc_buf and get IFCONF list 
    ifc.ifc_buf = malloc(ifc.ifc_len); 
    memset(ifc.ifc_buf,0x0,ifc.ifc_len); 

    if(ioctl(sfd,SIOCGIFCONF,&ifc) == -1) 
    { 
     perror("ioctl - SIOCGIFCONF : "); 
     return -1; 
    } 


    for(i = 0; i < devnums; i++,ifc.ifc_req++) 
    { 
     // idfy dev 
     if(strcmp(ifc.ifc_req->ifr_ifrn.ifrn_name,"lo") && ifc.ifc_req->ifr_ifrn.ifrn_name != 0) 
     { 
      ifr = ifc.ifc_req; 

      // IP address 
      struct sockaddr_in *a = (struct sockaddr_in *) &ifr->ifr_addr; 
      printf("%s",inet_ntoa(a->sin_addr)); 
      printf("\n"); 

      //get IFHWADDR 
      if(ioctl(sfd,SIOCGIFHWADDR,ifr) == -1) 
      { 
       perror("ioctl - SIOCGIFHWADDR : "); 
       return -1; 
      }    
     } 
    } 

    memcpy(macaddr,ifr->ifr_hwaddr.sa_data,sizeof(macaddr)); 
    for(i = 0; i < ETHER_ADDR_LEN; i++) 
    { 
     printf("%02x ",macaddr[i]); 
    } 
    printf("\n"); 

    close(sfd); 
    // free(ifc.ifc_buf); <- ?? error 

    return 0; 
} 

编辑

我把它换成下面一行:

printf("%02x ",macaddr[i]); 

printf("%02x ", (macaddr[i] & 0xff)); 

试试这个:

printf("%02x ", (unsigned char)macaddr[i] & 0xff); 

我们在格式字符串中指定了最小值字段宽度。因此,为了确保该值完全看起来像一个字节,可以通过应用位掩码仅保留前16位。

+0

哇,我想不出来。我会尝试。谢谢!! – black

+0

我解决了这个问题,但我仍然好奇macaddr [3]为什么打印'ffffffcc'。无论如何非常感谢你! – black

+0

@black,嗯,应该有另一个问题。你能用新的代码更新你的文章吗? –