2017-02-14 1 views
0

python gui로 프로그램을 작성 중입니다. 그 프로그램 컨셉은 우리가 prgm을 실행할 때 읽기 모드로 하나의 파일 (마녀는 TASK.txt와 같은 16 진수 값을 가짐)을 열 것을 요구할 것입니다. 은 하나의 변수에 한 줄의 데이터를 저장합니다. 어떻게 그 데이터를 ASCII 값으로 변환 할 수 있습니까? 새로운 Python입니다.16 진수 파일 데이터를 ASCII로 변환하려면 어떻게해야합니까?

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] 여야합니다. 오류 메시지는 유효한 16 진수가 아닌'binascii.unhexlify' 문자를 arg에 넣었다 고 말합니다.** 16 진수 데이터 앞에 '0x'를 붙이지 마라 **. 해당 데이터에 다른 문제가있을 수 있습니다. 해당 데이터의 작은 전형적인 샘플을 게시 할 수 있습니까? –

+0

답장을 보내 주셔서 감사합니다. 내 데이터입니다. H247314748F8 HA010001FD –

답변

0

그냥 제대로 질문을 다시 읽고, 새 응답 :

  1. 이후 0x으로 접두사하지 마십시오

    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() 
    

    이 내가 점점 오전 오류입니다 : 이것은 내 코드입니다 unhexlify과 함께 작동하지 않으며 문자열 길이를 균일하게 만들지도 않습니다.

  2. unhexlify.decode()
  3. 있듯이 here 지적하여 문자열로 디코딩 될 수있는 바이트 배열을 반환 헥스 숫자들의 각 쌍은 하나의 바이트 (인 한 문자)를 대표하기 때문에, 균일 한 문자열 길이가 필요 당신도 import binascii 필요가 없으며 bytearray.fromhex("7061756c").decode()
list(map(lambda hx: bytearray.fromhex(hx).decode(),"H7061756c H7061756c61".replace("H","").split(" "))) 

반환 값 진수를 문자열로 변환 할 수 있습니다 ['paul', 'paula']

,369 나는 철저하게 여전히 사용

될 수 있습니다 귀하의 질문에 를 읽기 전에 PM 2Ring가 언급 한 바와 같이 내가 쓴 무엇

, unhexilify0x 같은 접두사없이 작동합니다. 16 진수 문자열은 공백으로 구분되며 접두사는 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에 명시된 바와 같이 짝수 개의 16 진수가 필요하며 각 쌍은 1 바이트를 나타냅니다.

대신 정수 번호을 진수하는 16 진수로 변환하려면, 하나이 시도 :

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

int(string, base)은 하나 개의 번호 체계 (16 진수베이스 (16)이있다)로 변환됩니다베이스 10 (진수로).

** 오프 주제 **

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

는 문자의 더 양을 추가하기 때문에 z는 여전히 고르지 길이 인으로 이어질 것입니다.

관련 문제