2016-10-01 5 views
0

MACアドレスは、バイト配列(macaddr)に解析されます。バイトは、printf()の順に印刷された です。バイトは、 の16進数のペアのように見えます。しかし、一部にはf 文字が埋め込まれています。MACアドレスの印刷に関する問題

たとえば、macaddr[3]ことが'ffffffcc'なく'cc'、すなわち 4バイトの代わりに単一バイト印刷します。配列項目の残りの部分は正しく を印刷している(macaddr[0] = 00、= AAmacaddr[1]macaddr[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; 
} 

私は次の行に置き換えてきましたEDIT

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

答えて

0

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

はこれを試してみてください:

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

のフィールド幅をフォーマット文字列に指定します。したがって、値が正確に1バイトと見えるようにするには、ビットマスクを適用して最初の16ビットだけを残します。

+0

うわー私はそれを考えることができませんでした。やってみます。ありがとう!! – black

+0

私はこの問題を解決しましたが、なぜmacaddr [3]が 'ffffffcc'を印刷するのか不思議です。とにかくありがとう! – black

+0

@black、うーん、別の問題があるはずです。投稿を新しいコードで更新できますか? –