2017-02-14 62 views
0

正在用python寫一個程序gui。該程序的概念是當我們運行prgm時,它會要求打開一個文件(女巫包含十六進制值爲TASK.txt)和讀取模式。將一行的數據存儲在一個變量中。 如何將該數據轉換爲ascii值。對Python來說是新的。這是我的代碼:如何將十六進制文件數據轉換爲ASCII?

import binascii 
import base64 
from tkinter import * 
from tkinter.filedialog import askopenfilename 

def callback(): 
    with open(askopenfilename(),'r') as r: 
     next(r) 
     for x in r: 
      z = str(x[1:-2]) 
      if len(z) % 2: 
       z = '0' + 'x' + z 
      print(binascii.unhexlify(z)) 

a = Button(text='select file', command=callback) 
a.pack() 

mainloop() 

這是我收到的錯誤:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "D:\python sw\lib\tkinter\__init__.py", line 1699, in __call__ 
    return self.func(*args) 
    File "C:\Users\LENOVO\Downloads\hex2.py", line 16, in callback 
    print(binascii.unhexlify(z)) 
binascii.Error: Non-hexadecimal digit found""" 
+0

Tkinter的東西是無關緊要的。問題代碼應該是一個專注於實際問題的[mcve]。該錯誤消息表明,您在arg中的字符是'binascii.unhexlify',它們不是有效的十六進制數字。做**不**先於'十六進制數據''0x'。這些數據可能還有其他問題。你可以發佈一個典型的小樣本數據嗎? –

+0

謝謝你的回覆,這是我的資料H247314748F8 HA010001FD –

回答

0

只要正確重讀你的問題,新的答案:

  1. 因爲不要0x前綴它不適用於unhexlify,甚至不會使字符串長度均勻。
  2. 需要偶數串長度,由於各對己數字代表一個字節(即一個字符)
  3. unhexlify返回一個字節數組,其可被解碼以使用.decode()
  4. 正如指出here字符串你甚至都不需要import binascii和可以轉換十六進制對字符串bytearray.fromhex("7061756c").decode()
list(map(lambda hx: bytearray.fromhex(hx).decode(),"H7061756c H7061756c61".replace("H","").split(" "))) 

返回['paul', 'paula']

我寫之前,我仔細閱讀了你的問題 仍可能使用

的作爲PM 2Ring指出,unhexilify只有工作沒有像0x前綴。 您的十六進制字符串由空格分隔,並且前綴爲H,必須將其刪除。你已經這樣做,但我認爲這可以在一個更好的方式來完成:

r = "H247314748F8 HA010001FD" # one line in your file 
z_arrary = data.replace("H","").split(" ") 
# this returns ['247314748F8','A010001FD'] 
# now we can apply unhexlify to all those strings: 
unhexed = map(binascii.unhexlify, z_array) 
# and print it. 
print(list(unhexed)) 

這將引發你一個Error: Odd-length string。確保你真的想要unhexilify你的數據。如docs中所述,您需要偶數個十六進制字符,每對代表一個字節。

如果你想在十六進制數轉換爲十進制整數數字轉換相反,試試這個:

list(map(lambda hx: int(hx,16),"H247314748F8 HA010001FD".replace("H","").split(" "))) 

int(string, base)將從一個數字系統(十六進制具有基數爲16)轉換爲十進制(基數爲10 )。

**題外話**

 if len(z) % 2: 
      z = '0' + 'x' + z 

會導致到Z仍然長短不均的,因爲你增加了一個甚至字符的數量。