MAC地址合法性檢測

包老頭子發表於2016-10-31

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

相關文章