我想将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)
答案 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'