十六进制到二进制转换并打印多行

时间:2017-08-31 19:49:49

标签: python

我正在硬编码以下函数来解码hex到binanry。它看起来不像我想要的那样优雅,但它有效。有人可以帮我概括一下代码吗?

def print_hex_to_atp(hex,output_file):  

    if hex=="0":
        output_file.write("> Data   0 end;\n") #print hex 0 in binary
        output_file.write("> Data   0 end;\n") 
        output_file.write("> Data   0 end;\n") 
        output_file.write("> Data   0 end;\n")
    elif hex=="1":
        output_file.write("> Data   0 end;\n") #print hex 1 in binary
        output_file.write("> Data   0 end;\n") 
        output_file.write("> Data   0 end;\n") 
        output_file.write("> Data   1 end;\n")
    elif hex=="2":
        output_file.write("> Data   0 end;\n") #print hex 2 in binary
        output_file.write("> Data   0 end;\n") 
        output_file.write("> Data   1 end;\n") 
        output_file.write("> Data   0 end;\n")
    elif hex=="3":
        output_file.write("> Data   0 end;\n") #print hex 3 in binary
        output_file.write("> Data   0 end;\n") 
        output_file.write("> Data   1 end;\n") 
        output_file.write("> Data   1 end;\n")
    elif hex=="4":
        output_file.write("> Data   0 end;\n") #print hex 4 in binary
        output_file.write("> Data   1 end;\n") 
        output_file.write("> Data   0 end;\n") 
        output_file.write("> Data   0 end;\n")
    elif hex=="5":
        output_file.write("> Data   0 end;\n") 
        output_file.write("> Data   1 end;\n")
        output_file.write("> Data   0 end;\n") 
        output_file.write("> Data   1 end;\n")
    elif hex=="6":
        output_file.write("> Data   0 end;\n") 
        output_file.write("> Data   1 end;\n") 
        output_file.write("> Data   1 end;\n") 
        output_file.write("> Data   0 end;\n")

    else:
        c="invalid"

3 个答案:

答案 0 :(得分:2)

您可以使用bin函数和base的{​​{1}}参数:

int

这有输出:

def hex_to_bin(h):
    return bin(int(h, 16))[2:]

example = "1a"

for binary_digit in hex_to_bin(example):
    print(binary_digit)

请注意,如果您向其传递无效的十六进制字符串,则会抛出1 1 0 1 0

如果您希望将其填充到最近的nibble,则可以执行以下操作:

ValueError

将输出:

def hex_to_bin(h):
    return "{:0{}b}".format(int(h, 16), len(h) * 4)

如上所示,这两个都适用于任意长度的十六进制字符串,而不仅仅是单个数字。

这两个工作首先使用0 0 0 1 1 0 1 0 函数将十六进制字符串解析为整数,然后将该整数格式化为二进制。第二个使用Python的int迷你语言,指定格式(format)应该是二进制(:),用零填充(b) ,它应该是十六进制字符串长度的四倍(0 - > {})。 len(h) * 4花括号用于表示赋予{}的参数。第一个使用format函数,这是不言自明的,但它必须bin,因为[2:]函数将bin添加到生成的二进制文件的开头。 0b切掉了。

重新实现原始代码应该很容易。要做到这一点,你会做这样的事情:

2:

请注意,我已将您的变量重命名为for digit in hex_to_bin(hex_s): output_file.write("> Data {} end;\n".format(digit)) 。我推荐你这样做,因为hex是一个内置的Python函数(如果你计划使用hex,这可能会特别令人困惑)。

答案 1 :(得分:0)

您可以使用default AbstrctObjectDto map(AbstractObject value) { if (value instanceOf SomeObject) { // invoke mapping for SomeObject } //else if and more } 将十六进制字符串解码为整数。此外,您可以使用int(..,16)循环来获取四个不同的位,例如:

for

答案 2 :(得分:0)

hex="4"
base_10 = int(hex,16)
bin = "{0:04b}".format(base_10)
print("0x{0:02x} -> 0b{0:04b}".format(base_10) )
for bit in bin:
    print("> data\t{0} end".format(bit))