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地址,而每个网络位置会有一个专属于它的IP地址。为确保MAC地址的唯一性,以太网卡制造商将MAC地址固化到网卡中。地址的前半部分(24位)标识网卡的制造商,由IEEE分配,称为OUI(组织唯一标识符);地址的后半部分由网卡制造商为其网卡分配一个唯一的编号。
MAC地址为电脑网卡的物理地址,每个网卡拥有全球唯一的MAC,以示区别。
格式通常为6个字节的二进制代码(以6组16进制数表示,共占6个字节),格式为XX-XX-XX-XX-XX-XX 或者 XX:XX:XX:XX:XX:XX
在一些使用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(®, pattern, cflags);//编译正则模式
if(status != 0) {
regerror(status, ®, ebuf, sizeof(ebuf));
fprintf(stderr, "regcomp fail: %s , pattern '%s' \n",ebuf, pattern);
goto failed;
}
status = regexec(®, mac, nmatch, pmatch,0);//执行正则表达式和缓存的比较,
if(status != 0) {
regerror(status, ®, ebuf, sizeof(ebuf));
fprintf(stderr, "regexec fail: %s , mac:\"%s\" \n", ebuf, mac);
goto failed;
}
printf("[%s] match success.\n", __FUNCTION__);
regfree(®);
return 0;
failed:
regfree(®);
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;
}
}