网络中每台设备都有一个唯一的网络标识,这个地址叫 MAC 地址或网卡地址,由网络设备制造商生产时写在硬件内部。MAC 地址则是 48 位的(6 个字节),通常表示为 12 个 16 进制数,每 2 个 16 进制数之间用冒号隔开,如 08:00:20:0A:8C:6D 就是一个 MAC 地址。

但是,在计算机系统中 MAC 地址有许多种写法,例如

1
2
3
4
(1)08:00:20:0A:8C:6D
(2)08-00-20-0A-8C-6D
(3)0800200A8C6D
(4)0800.200A.8C6D

有时,我们需要对这些地址进行转换,今天我们将写一个小工具,实现各种格式的 MAC 地址之间的转换。

程序设计

简单说一下程序的设计思路,用户输入一个字符串,首先我们应该判断一下,用户输入的是否是一个合法的 MAC 地址(以上四种格式),如果不是,那应该抛出一个异常,告诉用户他输入的不是一个合法的 MAC 地址,如果用户输入的是一个合法的 MAC 地址,我们需要做进一步的判断,是具体哪种格式的,以转换成另外三种格式的。

如何判断一个字符串是否符合格式要求,我们可以使用正则表达式。正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

例如,我们可以用^[A-F0-9]{2}(:[A-F0-9]{2}){5}$这个表达式来匹配08:00:20:0A:8C:6D这个格式的 MAC 地址。同理,如下。

MAC 地址示例 正则表达式
08-00-20-0A-8C-6D ^[A-F0-9]{2}(-[A-F0-9]{2}){5}$
0800200A8C6D ^[A-F0-9]{12}$
0800.200A.8C6D ^[A-F0-9]{4}(.[A-F0-9]{4}){2}$

对用户输入的 MAC 地址进行匹配后,我们就可以开始转换了,对于使用:和 - 符号分隔的 MAC 地址,可以直接进行替换;对于 12 位无分隔的 MAC,可以通过其他格式的 MAC 地址剔除符号实现转换;4 位点分的 MAC 地址可以通过对 12 位无分隔的 MAC 地址进行 4 位点分实现。

程序实现

例子是 C#的,只贴关键代码,其他语言实现思路都一样,后附一个能跑通的程序(含工程)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 定义判断 MAC 地址是否合法的正则表达式
string regex_mac = @"^[A-F0-9]{2}(-[A-F0-9]{2}){5}$|^[A-F0-9]{2}(:[A-F0-9]{2}){5}$|^[A-F0-9]{12}$|^[A-F0-9]{4}(\.[A-F0-9]{4}){2}$";
string before_mac = before.Text.ToUpper(); // 这里定义了一个输入框,叫 before,用于用户输入待转换的 MAC 地址,并将小写的 MAC 地址统一成大写的
bool isMac = Regex.IsMatch(before_mac, regex_mac);// 正则判断是否是合法的 MAC 地址

// -分隔的 MAC 地址转换为:分隔的 MAC 地址
string mac1 = before_mac.Replace("-", ":");
// -分隔的 MAC 地址转换为无分隔的 MAC 地址
string mac2 = mac1.Replace("-", "");
// 无分隔的 MAC 地址转换为 4 位点分的 MAC 地址
string temp1 = mac2.Substring(0, 4);
string temp2 = mac2.Substring(4, 4);
string temp3 = mac2.Substring(8, 4);
string mac3 = temp1 + "." + temp2 + "." + temp3;