2017-08-31 80 views
0

我硬編碼以下函數將十六進制解碼爲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" 
+0

你爲什麼停六? –

回答

2

可以使用bin功能和intbase說法:

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 

注意,這將拋出一個ValueError如果你傳遞無效的十六進制字符串

如果你希望它被填充到最近的nibble,你可以這樣做:

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

這將有輸出:

0 
0 
0 
1 
1 
0 
1 
0 

作爲證明,無論在任意長度,這些工作十六進制字符串,不只是單個數字。

這兩種方法都是先將十六進制字符串解析爲一個整數,然後使用int函數,然後將該整數格式化爲二進制。第二個使用Python的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。我建議你也這樣做,因爲hex是內建的Python函數(如果你打算使用十六進制,這可能會讓你感到困惑)。

0

您可以使用int(..,16)將十六進制字符串解碼爲整數。此外,您可以例如使用一個for環獲得四個不同的位,如:

def print_hex_to_atp(hex,output_file): 
    try: 
     data = int(hex,16) 
     if data < 16: 
      for i in range(3,-1,-1): 
       output_file.write("> Data {} end;\n".format((data>>i) & 1)) 
     else: 
      # do something in case the value is greater than 15 
      pass 
    except ValueError: 
     # do something in case hex is not a valid hexadecimal string 
     pass 
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)) 
+0

https://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers – Yunnosch

+1

如果使用格式說明符「:#03x」,則不需要手動添加「0x」。 –