打印 MAC 地址的问题
Issues printing a MAC address
一个MAC地址被解析为一个字节数组(macaddr
)。字节是
一个接一个打印着printf()
。字节应该看起来像
一对十六进制字符。但是其中一些填充了 f
字符。
例如,对于 macaddr[3]
,它打印 'ffffffcc'
而不是 'cc'
,即
4 个字节而不是单个字节。打印其余的数组项
正确(macaddr[0]
= 00
,macaddr[1]
= AA
,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;
}
编辑
我已经替换了以下行:
printf("%02x ",macaddr[i]);
和
printf("%02x ", (macaddr[i] & 0xff));
试试这个:
printf("%02x ", (unsigned char)macaddr[i] & 0xff);
我们在格式字符串中指定最小 字段宽度。因此,为确保该值看起来完全像一个字节,您可以通过应用位掩码仅保留前 16 位。
一个MAC地址被解析为一个字节数组(macaddr
)。字节是
一个接一个打印着printf()
。字节应该看起来像
一对十六进制字符。但是其中一些填充了 f
字符。
例如,对于 macaddr[3]
,它打印 'ffffffcc'
而不是 'cc'
,即
4 个字节而不是单个字节。打印其余的数组项
正确(macaddr[0]
= 00
,macaddr[1]
= AA
,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;
}
编辑
我已经替换了以下行:
printf("%02x ",macaddr[i]);
和
printf("%02x ", (macaddr[i] & 0xff));
试试这个:
printf("%02x ", (unsigned char)macaddr[i] & 0xff);
我们在格式字符串中指定最小 字段宽度。因此,为确保该值看起来完全像一个字节,您可以通过应用位掩码仅保留前 16 位。