如何将字符串格式化为十六进制,然后格式化为二进制?

时间:2018-10-20 13:16:42

标签: python-3.x

我正在尝试对用户输入物理MAC地址并发生EUI64进程的过程进行编码。但是我不知道如何将一个字母(第一个或第二个单词字符)转换为十六进制值。例如:

mac_ad = input('Enter Your MAC address : ') (for example : BE-F0-84-DE-2F-53) 

因此,在这种情况下,程序必须将'B'和'E'转换为二进制。另外,MAC地址可以以数字开头,因此程序应确定它是数字还是字母。 MAC地址的标准格式是由连字符分隔的6组的两个十六进制数字。十六进制的“ B”为1011,而“ E”为二进制1110,在EUI64进程中,第七位应替换为相反的位置(此处为“ 1”,相反的位置为“ 0”)二进制变为1011 1100(E变成十进制的C,所以它的BC而不是BE) 之后,程序应打印BC-...

我应该怎么做?

1 个答案:

答案 0 :(得分:2)

要检查字符是否为字母,可以使用:

mac_address = 'BE-F0-84-DE-2F-53'
print(mac_address[0].isalpha())

如果字符是字母,则返回true。 (您可以使用.isdigit()检查整数)。

可能有一个更简单的方法,但是这对于转换第二个字符应该有效(请注意,无论该字符是数字还是字母,只要它是有效的十六进制字符,此方法都可以使用):

# Encode the array as a bytearray using fromhex and only taking the first two characters from the string.
encoded_array = bytearray.fromhex(mac_address[:2])
# This will be our output array. Just creating a copy so we can compare.
toggled_array = bytearray(encoded_array)
# Toggle the second byte from the right. (1 << 1 is one  byte from the right, namely 2 and ^ is the XOR command)
toggled_array[0] = encoded_array[0]^(1 << 1)

要检查发生了什么,请看一下输出:

print(encoded_array)
>>>bytearray(b'\xbe')
print(bin(encoded_array[0]))
>>>0b10111110
print(toggled_array)
>>>bytearray(b'\xbc')
print(bin(toggled_array[0]))
>>>0b10111100

要以字符串形式返回值,我们可以使用格式函数:

print(format(encoded_array[0], '02x'))
>>>be
print(format(toggled_array[0], '02x'))
>>>bc

如果您需要大写字母:

print(format(toggled_array[0], '02x').upper())
>>>BC