Python二进制到十六进制转换保留前导零

时间:2015-01-12 04:37:15

标签: python binary type-conversion hex

我想将576位二进制数转换为十六进制,所以我编写了以下python脚本。虽然写它很有趣,但我相信它是巨大的,丑陋的,而且很可能是不必要的复杂。我想知道是否有人使用内置的一些python来更有效地使用它。我使用任何我能找到的问题是保留前导零,因为它绝对是关键的。下面是我用来测试的输入和输出以及我编写的代码。

输入:

000011110111101011000101

输出:

0f7ac5

代码

file = open("binforhex.txt",'r')
stream = file.read()

num = []
byte = []
hexOut = []
n = 0

print stream

for x in stream:
    num.append(x)


while n < len(num):
    byte.append(int(num[n]))
    if n > 1:
        if (n + 1) % 4  == 0:
            if cmp([0, 0, 0, 0],byte) == 0 :
                hexOut.append('0')
            elif cmp([0, 0, 0, 1],byte) == 0 :
                hexOut.append('1')
            elif cmp([0, 0, 1, 0],byte) == 0 :
                hexOut.append('2')
            elif cmp([0, 0, 1, 1],byte) == 0 :
               hexOut.append('3')
            elif cmp([0, 1, 0, 0],byte) == 0:
                hexOut.append('4')
            elif cmp([0, 1, 0, 1],byte) == 0:
                hexOut.append('5')
            elif cmp([0, 1, 1, 0],byte) == 0:
                hexOut.append('6')
            elif cmp([0, 1, 1, 1],byte) == 0:
                hexOut.append('7')
            elif cmp([1, 0, 0, 0],byte) == 0:
                hexOut.append('8')
            elif cmp([1, 0, 0, 1],byte) == 0:
                hexOut.append('9')
            elif cmp([1, 0, 1, 0],byte) == 0:
                hexOut.append('a')
            elif cmp([1, 0, 1, 1],byte) == 0:
                hexOut.append('b')
            elif cmp([1, 1, 0, 0],byte) == 0:
                hexOut.append('c')
            elif cmp([1, 1, 0, 1],byte) == 0:
                hexOut.append('d')
            elif cmp([1, 1, 1, 0],byte) == 0:
                hexOut.append('e')
            elif cmp([1, 1, 1, 1],byte) == 0 :
                hexOut.append('f')
            byte.pop()
            byte.pop()
            byte.pop()
            byte.pop()
    n += 1
print ''.join(hexOut)

2 个答案:

答案 0 :(得分:1)

从二进制字符串b开始,您想要的十六进制数字总数为

hd = (len(b) + 3) // 4

所以...

x = '%.*x' % (hd, int('0b'+b, 0))

应该给你你想要的东西(当然你可以轻易地切掉'0x'前缀,只需使用x[2:])。

补充:格式字符串'%.*x'表示“格式为十六进制到一个长度,根据提供的参数,前导零”。这里的“提供的参数”是hd,我们需要的十六进制数字的总数。

简单,关键的概念是根据总位数(输入中的二进制,输出中的十六进制)而不是每种情况下的“前导零的数量”来考虑 - 后者将恰好落实到位。例如,如果输入二进制字符串有576位,无论它们中有多少是“前导零”,您希望输出十六进制字符串具有576 // 4,即144,十六进制数字,这就是{{1将被设置为 - 这就是你将通过这种格式获得多少位数(因为其中许多数字将根据需要为“前导零” - 不多也不少)。

答案 1 :(得分:0)

你知道吗hex()内置了吗?它将任何数字(包括二进制数,从0b开始)转换为十六进制字符串:

>>> hex(0b000011110111101011000101)
'0xf7ac5'