十六进制转二进制
我有一个字符串,内容是 ABC123EFFF。
我想把它转换成一个二进制的数字,结果应该是 001010101111000001001000111110111111111111,也就是一个有 42 位的二进制数,前面可以加零。
请问怎么做呢?
23 个回答
import binascii
binary_string = binascii.unhexlify(hex_string)
阅读
这个函数会把你给的十六进制字符串转换成二进制数据。
将十六进制转换为二进制
我有一个值 ABC123EFFF。
我想得到 001010101111000001001000111110111111111111(也就是二进制表示,长度为 42 位,并且前面有零)。
简短回答:
在 Python 3.6 中,新推出的 f-字符串可以用非常简洁的语法来实现这个功能:
>>> f'{0xABC123EFFF:0>42b}'
'001010101111000001001000111110111111111111'
或者可以用更清晰的方式分开来写:
>>> number, pad, rjust, size, kind = 0xABC123EFFF, '0', '>', 42, 'b'
>>> f'{number:{pad}{rjust}{size}{kind}}'
'001010101111000001001000111110111111111111'
详细回答:
你实际上是在说你有一个十六进制的值,而你想把它转换成二进制的表示。
这个转换的核心是一个整数。不过你可能一开始是以字符串的形式存在,最后也需要以字符串的形式呈现二进制。
将十六进制转换为二进制,42 位并且前面有零?
我们有几种直接的方法可以实现这个目标,而不需要用切片来搞一些小把戏。
首先,在进行任何二进制操作之前,需要先将其转换为整数(我假设这是以字符串格式存在,而不是字面量):
>>> integer = int('ABC123EFFF', 16)
>>> integer
737679765503
另外,我们也可以使用以十六进制形式表示的整数字面量:
>>> integer = 0xABC123EFFF
>>> integer
737679765503
现在我们需要将这个整数转换为二进制表示。
使用内置函数 format
然后传递给 format
函数:
>>> format(integer, '0>42b')
'001010101111000001001000111110111111111111'
这使用了格式规范的 迷你语言。
为了更好理解,这里是它的语法形式:
[[fill]align][sign][#][0][width][,][.precision][type]
为了满足我们的需求,我们只需排除不需要的部分:
>>> spec = '{fill}{align}{width}{type}'.format(fill='0', align='>', width=42, type='b')
>>> spec
'0>42b'
然后直接传递给 format 函数:
>>> bin_representation = format(integer, spec)
>>> bin_representation
'001010101111000001001000111110111111111111'
>>> print(bin_representation)
001010101111000001001000111110111111111111
使用 str.format
进行字符串格式化(模板化)
我们可以在字符串中使用 str.format
方法:
>>> 'here is the binary form: {0:{spec}}'.format(integer, spec=spec)
'here is the binary form: 001010101111000001001000111110111111111111'
或者直接把格式规范放在原始字符串中:
>>> 'here is the binary form: {0:0>42b}'.format(integer)
'here is the binary form: 001010101111000001001000111110111111111111'
使用新 f-字符串进行字符串格式化
让我们来演示一下新的 f-字符串。它们使用相同的迷你语言格式规则:
>>> integer = 0xABC123EFFF
>>> length = 42
>>> f'{integer:0>{length}b}'
'001010101111000001001000111110111111111111'
现在我们把这个功能放到一个函数中,以便于重复使用:
def bin_format(integer, length):
return f'{integer:0>{length}b}'
现在:
>>> bin_format(0xABC123EFFF, 42)
'001010101111000001001000111110111111111111'
附注
如果你只是想把数据编码为内存或磁盘上的字节字符串,可以使用 int.to_bytes
方法,这个方法只在 Python 3 中可用:
>>> help(int.to_bytes)
to_bytes(...)
int.to_bytes(length, byteorder, *, signed=False) -> bytes
...
而且因为 42 位除以每个字节 8 位等于 6 字节:
>>> integer.to_bytes(6, 'big')
b'\x00\xab\xc1#\xef\xff'
关于解决左侧多余零的问题:
my_hexdata = "1a"
scale = 16 ## equals to hexadecimal
num_of_bits = 8
bin(int(my_hexdata, scale))[2:].zfill(num_of_bits)
这样做会得到 00011010,而不是去掉多余零后的版本。