2012-01-26 20 views
5

Quiero convertir una dirección MAC 00163e2fbab7 (almacenada como una cadena) a su representación de cadena 00: 16: 3e: 2f: ba: b7. ¿Cuál es la forma más fácil de hacer esto?Cómo convertir un número MAC a una cadena MAC?

+0

¿Cómo se obtiene la dirección MAC, y cómo se almacenan en su programa ahora? Dado que no cabe en un entero de 32 bits, ¿quizás ya lo tiene como una cadena que solo necesita ser reformateado? –

+0

@Joachim: Se almacena como una cadena. – Bruce

Respuesta

22

utilizar un método completamente tortuosa para tomar ventaja de una función existente de que los grupos de dos caracteres hexadecimales a la vez:

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

Actualización para Python 3:

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

+1 perfecto! esto sería lo correcto para hacer – juliomalegria

+0

+1 Esta solución se siente más natural. –

10

Utilizando el grouper idiomzip(*[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' 

También es posible, (y, de hecho, un poco más rápido):

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

Lo mismo para mí: wow (¡las herramientas de iteración son geniales!). Gracias por compartir – jlandercy

5

Si usted tiene una cadena s que desea unirse con dos puntos , Esto debería funcionar.

':'.join([s[i]+s[i+1] for i in range(0,12,2)]) 
+1

's [i] + s [i + 1]' ==> 's [i: i + 2]' –

+0

@StevenRumbalski Esto no es lo mismo. Cambiarlo de esta manera devolvería una matriz de dos elementos. Podría usar ''' .join (s [i: i + 2])'. –

+0

@Michaelior: No estoy seguro de lo que quiere decir. '':'. join ([s [i] + s [i + 1] para i en rango (0,12,2)])' da el mismo resultado que '':'. join ([s [i: i + 2] para i en rango (0,12,2)]) 'cuando lo ejecuto. String slicing no devuelve una matriz. –

4

Si está adicto a las expresiones regulares puede probar este enfoque antiponético:

>>> import re 
>>> s = '00163e2fbab7' 
>>> ':'.join(re.findall('..', s)) 
'00:16:3e:2f:ba:b7' 
0

> funciona bien con 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) 
Cuestiones relacionadas