Python:如何将一串二进制值(任意长度)转换为十六进制数据?

时间:2013-06-17 20:17:48

标签: python binary hex string-conversion

我需要将data = "00000111010110101"之类的字符串转换为十六进制字符串,在本例中我需要'075A80'

您可能会注意到一些警告:

  • 不应剥离前导零,因此hex(int(data,2))对我不起作用
  • 如果len(data)%8!= 0,则字符串应附加零,以完整字节结束

在搜索了这个论坛并将不同的答案混合在一起之后,这是我发现的一种方式,但它似乎相当复杂,我希望其他人看到更简单的方法。

data_hex = "".join([ "%02X" % int("".join(a),2) for a in izip_longest(*(iter(data),)*8, fillvalue='0')])

谢谢!

编辑:数据的一些背景知识。基础数据纯粹是位,它不表示整数或其他数值,因此前导零是相关的,必须在结果中表示。在(右)端附加零也不会改变我的用例中的“值”。

2 个答案:

答案 0 :(得分:2)

这是一个选项:

>>> data = "00000111010110101"
>>> new_data = data + '0' * ((8 - len(data)) % 8)
>>> '{0:0{width}x}'.format(int(new_data, 2), width=len(new_data) / 4)
'075a80'

第一行附加零,因此长度是8的倍数,第二行是十六进制字符串的格式。

答案 1 :(得分:1)

将输入0填充为8的倍数,然后将其转换为十六进制值:

multiple, remainder = divmod(len(data), 8)
if remainder:
    data = format(data, '<0{}'.format((multiple + 1) * 8))
result = format(int(data, 2), '0{}x'.format((multiple + 1) * 2))

输出也被填充,每个完整字节有2个十六进制字符。

这给出了:

>>> data = "00000111010110101"
>>> multiple, remainder = divmod(len(data), 8)
>>> if remainder:
...     data = format(data, '<0{}'.format((multiple + 1) * 8))
... 
>>> format(int(data, 2), '0{}x'.format((multiple + 1) * 2))
'075a80'