我需要将data = "00000111010110101"
之类的字符串转换为十六进制字符串,在本例中我需要'075A80'
您可能会注意到一些警告:
在搜索了这个论坛并将不同的答案混合在一起之后,这是我发现的一种方式,但它似乎相当复杂,我希望其他人看到更简单的方法。
data_hex = "".join([ "%02X" % int("".join(a),2) for a in izip_longest(*(iter(data),)*8, fillvalue='0')])
谢谢!
编辑:数据的一些背景知识。基础数据纯粹是位,它不表示整数或其他数值,因此前导零是相关的,必须在结果中表示。在(右)端附加零也不会改变我的用例中的“值”。
答案 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'