首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印MAC地址

打印MAC地址
EN

Stack Overflow用户
提问于 2016-10-01 08:33:04
回答 1查看 165关注 0票数 0

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

例如,对于macaddr[3],它打印的是'ffffffcc'而不是'cc',即4个字节而不是单个字节。其余的数组项被正确打印(macaddr[0] = 00macaddr[1] = AAmacaddr[2] = BB,等等)

有什么问题吗?请帮我找出这个程序有什么问题。

代码语言:javascript
复制
#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;
}

编辑

我已经替换了以下一行:

代码语言:javascript
复制
printf("%02x ",macaddr[i]);

使用

代码语言:javascript
复制
printf("%02x ", (macaddr[i] & 0xff));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-01 08:45:43

试试这个:

代码语言:javascript
复制
printf("%02x ", (unsigned char)macaddr[i] & 0xff);

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39804555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档