一、 概述
工作中有时候会遇到需要对mac地址进行操作,特别是嵌入式的行业。
比如对MAC地址进行格式化输出,对MAC地址进行比较,对MAC地址进行修改。
但是,对于十六进制的MAC如何操作才能实现这些需求呢。
通常,我们对整型数值比较熟悉,因此,可以把MAC地址转换为整型数值进行操作,然后再转换回来。
下面就直接给出例子和输出结果,例子比较简单,直接看就明白。
二、例子
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if.h>
static int get_mac(const char *ifname, unsigned char *mac, int len);
static int get_mac(const char *ifname, unsigned char *mac, int len)
{
int isocket = -1, iret = 0;
struct ifreq ifreq;
if (ifname == NULL || mac == NULL)
{
printf("invalid param\n");
return -1;
}
isocket = socket(AF_INET, SOCK_STREAM, 0);
if (isocket < 0)
{
printf("create socket error\n");
iret = -1;
goto End;
}
strcpy(ifreq.ifr_name, ifname);
if (ioctl(isocket, SIOCGIFHWADDR, &ifreq) < 0)
{
printf("ioctrl error\n");
iret = -1;
goto End;
}
memcpy(mac, (unsigned char *)ifreq.ifr_hwaddr.sa_data, 6);
End:
if (isocket >= 0)
close(isocket);
return iret;
}
int main(int argc, char **argv)
{
unsigned char mac[12];
char acMac1[32] = {0};
char acMac2[32] = {0};
char acMac3[32] = {0};
char acMac4[32] = {0};
unsigned long long ullmac1 = 0;
unsigned long long ullmac2 = 0;
unsigned int a1 = 0;
unsigned int a2 = 0;
unsigned int a3 = 0;
unsigned int a4 = 0;
unsigned int a5 = 0;
unsigned int a6 = 0;
// 获取mac地址
if (get_mac("eth2", mac, sizeof(mac)) < 0)
{
printf("get_mac error\n");
return -1;
}
// 转换mac地址格式
snprintf(acMac1, sizeof(acMac1),"%02X:%02X:%02X:%02X:%02X:%02X",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
snprintf(acMac2, sizeof(acMac2),"%02X%02X%02X%02X%02X%02X",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
printf("acMac1[%s]\n", acMac1);
printf("acMac2[%s]\n", acMac2);
// mac地址转换为无符号16位整型
ullmac1 = strtoull(acMac2, NULL, 16);
// 对数值执行操作
ullmac2 = ullmac1 + 1;
printf("ullmac1[%llu]\n",ullmac1);
printf("ullmac2[%llu]\n",ullmac2);
// 对操作之后的数值,重新转换为mac地址格式
a1 = (ullmac2 >> 40) & 0xFF;
a2 = (ullmac2 >> 32) & 0xFF;
a3 = (ullmac2 >> 24) & 0xFF;
a4 = (ullmac2 >> 16) & 0xFF;
a5 = (ullmac2 >> 8) & 0xFF;
a6 = (ullmac2) & 0xFF;
snprintf(acMac3, sizeof(acMac3),"%02X:%02X:%02X:%02X:%02X:%02X",a1,a2,a3,a4,a5,a6);
snprintf(acMac4, sizeof(acMac4),"%02X%02X%02X%02X%02X%02X",a1,a2,a3,a4,a5,a6);
printf("acMac3[%s]\n", acMac3);
printf("acMac4[%s]\n", acMac4);
return 0;
}
输出结果:
acMac1[00:0C:29:87:80:CD]
acMac2[000C298780CD]
ullmac1[52236353741]
ullmac2[52236353742]
acMac3[00:0C:29:87:80:CE]
acMac4[000C298780CE]