MAC地址合法性检测

MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址、硬件地址,用来定义网络设备的位置。在OSI模型中,第三层网络层负责 IP地址,第二层数据链路层则负责 MAC地址。
MAC地址是网卡决定的,是固定的。因此一个主机会有一个MAC地址,而每个网络位置会有一个专属于它的IP地址。为确保MAC地址的唯一性,以太网卡制造商将MAC地址固化到网卡中。地址的前半部分(24位)标识网卡的制造商,由IEEE分配,称为OUI(组织唯一标识符);地址的后半部分由网卡制造商为其网卡分配一个唯一的编号。
MAC地址为电脑网卡的物理地址,每个网卡拥有全球唯一的MAC,以示区别。
格式通常为6个字节的二进制代码(以6组16进制数表示,共占6个字节),格式为XX-XX-XX-XX-XX-XX 或者 XX:XX:XX:XX:XX:XX
比如: ED-DD-4D-45-5A-9F


在一些使用MAC地址的场合中,需要对MAC地址进行合法性检测,以下提示C和JAVA两种检测方法,原理基本一致,都是使用正则表达式进行匹配:


匹配模式:"^([A-Fa-f0-9]{2}[-,:]){5}[A-Fa-f0-9]{2}$"

^ 代表开头

[A-Fa-f0-9]{2}  表示由两个16进进字符制组成 

[-,:] 分隔符可能 为 " : "或 " - "

{5} 前面由5个类似格式的字段组成,即 5个 XX- 或 XX:

[A-Fa-f0-9]{2} 表示由两个16进进字符制组成结尾

$ 代表结尾


1. C/C++实现:

#include <stdio.h>
#include <sys/types.h>
#include <regex.h>


int is_valid_mac_addr(char* mac) { 
   
	int status;
	const char * pattern = "^([A-Fa-f0-9]{2}[-,:]){5}[A-Fa-f0-9]{2}$";
	const int cflags = REG_EXTENDED | REG_NEWLINE;	
	
	char ebuf[128];
	regmatch_t pmatch[1];
	int nmatch = 10;
	regex_t reg;


	status = regcomp(&reg, pattern, cflags);//编译正则模式
	if(status != 0) {
		regerror(status, &reg, ebuf, sizeof(ebuf));
		fprintf(stderr, "regcomp fail: %s , pattern '%s' \n",ebuf, pattern);
		goto failed;
	}

	status = regexec(&reg, mac, nmatch, pmatch,0);//执行正则表达式和缓存的比较,
	if(status != 0) {
		regerror(status, &reg, ebuf, sizeof(ebuf));
		fprintf(stderr, "regexec fail: %s , mac:\"%s\" \n", ebuf, mac);
		goto failed;
	}

	printf("[%s] match success.\n", __FUNCTION__);
	regfree(&reg);
	return 0;

failed:
	regfree(&reg);
	return -1;
}


2. JAVA实现:

	private boolean isValidMac(String macStr) {
		
		if (macStr == null || macStr.equals("")) {
			return false;
		}
		String macAddressRule = "([A-Fa-f0-9]{2}[-,:]){5}[A-Fa-f0-9]{2}";
		// 这是真正的MAC地址;正则表达式;
		if (macStr.matches(macAddressRule)) {
			Log.i(TAG, "it is a valid MAC address");
			return true;
		} else {
			Log.e(TAG, "it is not a valid MAC address!!!");
			return false;
		}
	}



参考文章:

MAC 地址格式 解说

©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值