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 地址格式 解说

### 如何验证MAC地址的有效性 为了确保MAC地址的有效性,可以采用正则表达式来匹配标准的MAC地址格式。不同编程语言提供了不同的实现方式。 #### Java中的MAC地址合法性检测Java中,通过定义一个特定模式的字符串`String macAddressRule = "([A-Fa-f0-9]{2}[-,:]){5}[A-Fa-f0-9]{2}"`用于表示有效的MAC地址格式[^1]。此规则允许十六进制字符(大小写均可),并支持三种分隔符:连字符(-),冒号(:)以及逗号(,)。当输入字符串与该模式完全匹配时,则认为这是一个合法MAC地址。 ```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}"; if (macStr.matches(macAddressRule)) { System.out.println("It is a valid MAC address"); return true; } else { System.out.println("It is not a valid MAC address!!!"); return false; } } ``` 对于C语言而言,同样可以通过编写类似的正则表达式来进行验证: ```c #include <regex.h> ... char *reg="^[0-9A-F]{2}([-:]?)[0-9A-F]{2}(\\1[0-9A-F]{2}){4}$"; // 使用 regex 库函数进行匹配操作 ... ``` 这里使用的正则表达式稍有不同,增加了对连续两个相同分隔符的支持,并且只接受大写的十六进制字母[^3]。 值得注意的是,在某些情况下可能还需要进一步确认这些设备标识符是否实际存在于网络上或属于某个具体的硬件制造商,但这超出了简单的语法检查范围。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值