16 진수로 인코딩 된 ASCII 문자열을 일반 ASCII로 변환 하시겠습니까?


147

파이썬에서 16 진수에서 일반 ASCII로 어떻게 변환 할 수 있습니까?

예를 들어 "0x7061756c"를 "paul"으로 변환하려고합니다.


나는 여기에서 찾은 많은 것들을 시도했다 : docs.python.org/library/binascii.html
Paul Reiners

1
당신이 우리에게 준 링크의 도움으로, 당신이 찾고있는 기능을 발견했습니다. 정확히 무엇 을 시도했고 왜 작동하지 않습니까?
Vincent Savard

1
다음을 시도했습니다 : >>> binascii.b2a_hqx ( "0x7061756c") '-(Jh- $ Ba0c8fB`'>>> binascii.b2a_uu ( "0x7061756c") "*, '@ W, # 8Q-S4V8P \ n" >>> binascii.b2a_base64 ( "0x7061756c") 'MHg3MDYxNzU2Yw == \ n'>>> binascii.b2a_qp ( "0x7061756c") '0x7061756c'>>> binascii.b2a_hex ( "0x7061756c735>"307x3703366 '>) .b2a_hex (0x7061756c) 역 추적 (가장 최근 호출) : <모듈>의 1 행, "<stdin>"파일 TypeError : int가 아닌 문자열 또는 버퍼 여야합니다. >>>
Paul Reiners

그들 중 누구도 'paul'을 반환하지 않았기 때문에 아무도 효과가 없었습니다.
Paul Reiners 2016 년

2
"7 비트"ASCII를 의미하지 않습니까? (ASCII가 단지 7 비트이기 때문에 어리석은 일입니다.) GUID는 128 비트입니다.

답변:


231

약간 더 간단한 해결책 :

>>> "7061756c".decode("hex")
'paul'

143
.decode('hex')파이썬 3 에는 없습니다 . 파이썬 2 .decode('hex')에는 사용 binascii.unhexlify()합니다 .
jfs

2
지적 해 주셔서 감사합니다. 저는 Python 3에 익숙하지 않습니다.이 솔루션은 내가 아는 한 1에서 작동하지 않습니다.
cjm

27
codecs.decode("7061756c", "hex")파이썬 2와 파이썬 3에서 작동하지만 파이썬 3에서는 bytes()문자열을 반환 하지만 ASCII 문자열에는 적합합니다.
마크 에반스

101

라이브러리를 가져올 필요가 없습니다.

>>> bytearray.fromhex("7061756c").decode()
'paul'

2
공백을 허용하므로 나에게 가장 적합한 솔루션 (python 3에서 작동) :bytearray.fromhex("70 61 75 6C").decode()
Jona

bytearray.fromhex ( "70e4756c"). decode (encoding = "Latin1") 'päul'바이너리로 연주하는 사람들을 위해 확장 문자는 기본 utf-8 디코드에서 질식했습니다. 내가 참조! 감사!
grambo

물론 텍스트로 해석 되려면 데이터 의 실제 인코딩 을 알아야합니다 . 를 사용 'latin-1'하면 오류가 제거되지만 텍스트가 실제로 라틴 -1이 아닌 경우 완전한 횡설수설이 발생할 수 있습니다.
tripleee 2009 년

43
>>> txt = '7061756c'
>>> ''.join([chr(int(''.join(c), 16)) for c in zip(txt[0::2],txt[1::2])])
'paul'                                                                          

난 그냥 재미 있지만 중요한 부분은 다음과 같습니다

>>> int('0a',16)         # parse hex
10
>>> ''.join(['a', 'b'])  # join characters
'ab'
>>> 'abcd'[0::2]         # alternates
'ac'
>>> zip('abc', '123')    # pair up
[('a', '1'), ('b', '2'), ('c', '3')]        
>>> chr(32)              # ascii to character
' '

binascii를 지금 볼 것입니다 ...

>>> print binascii.unhexlify('7061756c')
paul

시원합니다 (그리고 다른 사람들이 왜 당신을 도와주기 전에 농구를 뛰어 넘기를 원하는지 모르겠습니다).


16

파이썬 2에서 :

>>> "7061756c".decode("hex")
'paul'

파이썬 3에서 :

>>> bytes.fromhex('7061756c').decode('utf-8')
'paul'

5

16 진수 문자열이 아닌 16 진수 정수로 작업 할 때의 해결책은 다음과 같습니다.

def convert_hex_to_ascii(h):
    chars_in_reverse = []
    while h != 0x0:
        chars_in_reverse.append(chr(h & 0xFF))
        h = h >> 8

    chars_in_reverse.reverse()
    return ''.join(chars_in_reverse)

print convert_hex_to_ascii(0x7061756c)

유용한 예는 +1이지만 "hex"를 입력으로 변환하지 않지만 정수를 16 진 문자열로 변환합니다. 코드도 동일하게 작동 print convert_hex_to_ascii(123456)합니다.
마크 라 카타

5

또는이 작업을 수행 할 수도 있습니다 ...

파이썬 2 통역

print "\x70 \x61 \x75 \x6c"

user@linux:~# python
Python 2.7.14+ (default, Mar 13 2018, 15:23:44) 
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> print "\x70 \x61 \x75 \x6c"
p a u l
>>> exit()
user@linux:~# 

또는

파이썬 2 원 라이너

python -c 'print "\x70 \x61 \x75 \x6c"'

user@linux:~# python -c 'print "\x70 \x61 \x75 \x6c"'
p a u l
user@linux:~# 

파이썬 3 통역

user@linux:~$ python3
Python 3.6.9 (default, Apr 18 2020, 01:56:04) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> print("\x70 \x61 \x75 \x6c")
p a u l

>>> print("\x70\x61\x75\x6c")
paul

파이썬 3 원 라이너

python -c 'print("\x70 \x61 \x75 \x6c")'

user@linux:~$ python -c 'print("\x70 \x61 \x75 \x6c")'
p a u l

user@linux:~$ python -c 'print("\x70\x61\x75\x6c")'
paul

2
이것은 공백없이 잘 작동하며 print ()를 사용하여 python3에서 잘 작동합니다.
rjferguson

예, 쉽게 볼 수 있도록 의도적으로 작성했습니다. Python 3으로 답변을 업데이트하겠습니다.
사브리나

3

파이썬 3.3.2에서 테스트 이것을 수행하는 방법에는 여러 가지가 있습니다. 여기에는 파이썬에서 제공하는 것만 사용하여 가장 짧은 방법 중 하나가 있습니다.

import base64
hex_data ='57696C6C20796F7520636F6E76657274207468697320484558205468696E6720696E746F20415343494920666F72206D653F2E202E202E202E506C656565656173652E2E2E212121'
ascii_string = str(base64.b16decode(hex_data))[2:-1]
print (ascii_string)

물론 가져 오기를 원하지 않으면 언제든지 자신의 코드를 작성할 수 있습니다. 이와 같은 매우 기본적인 것 :

ascii_string = ''
x = 0
y = 2
l = len(hex_data)
while y <= l:
    ascii_string += chr(int(hex_data[x:y], 16))
    x += 2
    y += 2
print (ascii_string)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.