-1

我需要将字符串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')])

谢谢!

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

4

2 回答 2

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 的倍数,第二行格式化您的十六进制字符串。

于 2013-06-17T20:35:28.587 回答
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'
于 2013-06-17T20:37:39.983 回答