【Linux】教你如何玩转MAC地址

一、 概述


工作中有时候会遇到需要对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]




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值