如何将MAC地址转换为MAC字符串?

5

我想要将以字符串形式存储的MAC地址00163e2fbab7转换为其字符串表示形式00:16:3e:2f:ba:b7。最简单的方法是什么?


你如何获取MAC地址,它现在在你的程序中是如何存储的?由于它无法适应32位整数,也许你已经将其作为字符串存储,只需要重新格式化即可。 - Some programmer dude
@Joachim:它被存储为字符串。 - Bruce
6个回答

24

使用一种非常间接的方法来利用现有函数,该函数每次分组两个十六进制字符:

>>> ':'.join(s.encode('hex') for s in '00163e2fbab7'.decode('hex'))
'00:16:3e:2f:ba:b7'

已更新至Python 3:

>>> ':'.join(format(s, '02x') for s in bytes.fromhex('00163e2fbab7'))
'00:16:3e:2f:ba:b7'

1
警告:如果未在字符串中使用前导0填充,则不起作用。 - Scott P.

11

使用 grouper 惯用法 zip(*[iter(s)]*n)

In [32]: addr = '00163e2fbab7'

In [33]: ':'.join(''.join(pair) for pair in zip(*[iter(addr)]*2))
Out[33]: '00:16:3e:2f:ba:b7'

也有另外一种可能性(事实上,速度稍微快一些):

In [36]: ':'.join(addr[i:i+2] for i in range(0,len(addr),2))
Out[36]: '00:16:3e:2f:ba:b7'

我也一样:哇(itertools太棒了!)。谢谢分享。 - jlandercy

5
如果你有一个字符串 s,想要用冒号进行连接,可以使用以下方法。
':'.join([s[i]+s[i+1] for i in range(0,12,2)])

@StevenRumbalski 这不是同一件事。以这种方式更改将返回一个两个元素的数组。您可以使用 ''.join(s[i:i+2]) - Michael Mior
@Michaelior:不确定你的意思。当我运行':'.join([s[i]+s[i+1] for i in range(0,12,2)])时,它会给出与':'.join([s[i:i+2] for i in range(0,12,2)])相同的结果。字符串切片不会返回一个数组。 - Steven Rumbalski
@StevenRumbalski 当然你是对的。我当时在想另一件事,那个用了一个数组的东西。 - Michael Mior

4
如果您沉迷于正则表达式,您可以尝试这种非常Pythonic的方法:
>>> import re
>>> s = '00163e2fbab7'
>>> ':'.join(re.findall('..', s))
'00:16:3e:2f:ba:b7'

0

> 适用于 Python 3

ap_mac = b'\xfe\xdc\xba\xab\xcd\xef'
decoded_mac = hexlify(ap_mac).decode('ascii')
formatted_mac = re.sub(r'(.{2})(?!$)', r'\1:', decoded_mac)

0

我改编了Josh Lee上面的答案,以始终生成有效的MAC地址:

def to_mac(addr: int, sep=':'):
    return sep.join('{:02x}'.format(s) for s in bytes.fromhex('{:012x}'.format(addr)))

一些例子/测试:

print(to_mac(0x1))
print(to_mac(0x12))
print(to_mac(0x123))
print(to_mac(0x1234))
print(to_mac(0x12345))
print(to_mac(0x123456))
print(to_mac(0x1234567))
print(to_mac(0x12345678))
print(to_mac(0x123456789))
print(to_mac(0x123456789A))
print(to_mac(0x123456789AB))
print(to_mac(0x123456789ABC, sep='-').upper())

00:00:00:00:00:01
00:00:00:00:00:12
00:00:00:00:01:23
00:00:00:00:12:34
00:00:00:01:23:45
00:00:00:12:34:56
00:00:01:23:45:67
00:00:12:34:56:78
00:01:23:45:67:89
00:12:34:56:78:9a
01:23:45:67:89:ab
12-34-56-78-9A-BC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接