2016-10-01 66 views
0

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

回答

0

試試這個:

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

我們在格式字符串中指定了最小值字段寬度。因此,爲了確保該值完全看起來像一個字節,可以通過應用位掩碼僅保留前16位。

+0

哇,我想不出來。我會嘗試。謝謝!! – black

+0

我解決了這個問題,但我仍然好奇macaddr [3]爲什麼打印'ffffffcc'。無論如何非常感謝你! – black

+0

@black,嗯,應該有另一個問題。你能用新的代碼更新你的文章嗎? –