【问题标题】:Python Binary to hex conversion preserving leading zeroesPython二进制到十六进制转换保留前导零
【发布时间】:2015-03-09 19:53:10
【问题描述】:

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

【问题讨论】:

    标签: python binary type-conversion hex


    【解决方案1】:

    你知道有一个hex() 内置函数吗?它将任何数字(包括二进制数,以0b 开头)转换为十六进制字符串:

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

    【讨论】:

    • 我试过了,但请注意前导零的丢失。我打算使用它的 576 位数将有大量不同数量的前导零,我必须保留。
    • @Tom,好吧,您可以使用它返回十六进制值,去掉前导 0x,检查结果的长度,如果不够长,则使用 @ 在前面添加 1 个或多个零987654326@。很简单。
    【解决方案2】:

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

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

    所以...:

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

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

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

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

    【讨论】:

    • 完美无瑕,但我不确定它是如何做到的。您想澄清第二部分吗?
    • 完成——添加了详细的解释,希望对您有所帮助!
    • 绝对做到了。谢谢。
    • @Tom:你也可以使用format()'{:0{}x}'.format(int(b, 2), hd)
    • @JFSebastian,你是对的,而且它会更优雅——我是一个“老手”,所以我很自然地陷入了%-formatting,但在今天的 Python @987654332 @ 好多了(我的决定是在下一版的果壳中只使用后者!-)。
    猜你喜欢
    • 2015-11-18
    • 2015-07-20
    • 2013-05-31
    • 2013-05-10
    • 2013-08-05
    • 2016-02-09
    • 2016-09-15
    相关资源
    最近更新 更多