十六进制转二进制

154 投票
23 回答
505691 浏览
提问于 2025-04-15 14:20

我有一个字符串,内容是 ABC123EFFF。

我想把它转换成一个二进制的数字,结果应该是 001010101111000001001000111110111111111111,也就是一个有 42 位的二进制数,前面可以加零。

请问怎么做呢?

23 个回答

76
import binascii

binary_string = binascii.unhexlify(hex_string)

阅读

binascii.unhexlify

这个函数会把你给的十六进制字符串转换成二进制数据。

85

将十六进制转换为二进制

我有一个值 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'
154

关于解决左侧多余零的问题:


my_hexdata = "1a"

scale = 16 ## equals to hexadecimal

num_of_bits = 8

bin(int(my_hexdata, scale))[2:].zfill(num_of_bits)

这样做会得到 00011010,而不是去掉多余零后的版本。

撰写回答