16進数でエンコードされたASCII文字列からプレーンASCIIに変換しますか?


146

Pythonで16進数からプレーンASCIIに変換するにはどうすればよいですか?

たとえば、 "0x7061756c"を "paul"に変換したいことに注意してください。


私はここで見つけたものをたくさん試しました:docs.python.org/library/binascii.html
Paul Reiners

1
あなたが私たちに与えたリンクの助けを借りて、私はあなたが探していた機能を見つけました。正確に何を試しましたか、なぜうまくいかなかったのですか?
Vincent Savard、2012年

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( "0x7061756c")bicici.b2a_hex( "0x7061756c") '4033730'363' 730 .b2a_hex(0x7061756c)トレースバック(最新の呼び出しの最後):ファイル"<STDIN>"、行1、で、<モジュール>はTypeError:文字列であるか、バッファリングする必要がありませんint型>>>
ポールReiners

彼らはどれも「ポール」を返さなかったので、どれも働いていませんでした。
Paul Reiners、2012年

2
「7ビット」ASCIIという意味ですか?(ASCIIのみ7ビットであるため、どちらがソート愚かなのである。)A GUIDは128ビットである...

回答:


231

少し簡単な解決策:

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

142
.decode('hex')Python 3 にはありません。Python2で.decode('hex')使用binascii.unhexlify()ます。
jfs

2
ご指摘いただきありがとうございます。私はPython 3に慣れていません。このソリューションも、私の知る限り1では機能しません。
cjm 2012年

26
codecs.decode("7061756c", "hex")Python 2とPython 3で動作しますがbytes()、Python 3では文字列を返しますが、ASCII文字列の場合は妥当です。
Mark Evans

100

ライブラリをインポートする必要はありません:

>>> 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 2017年

もちろん、データをテキストとして解釈する場合は、データの実際のエンコーディングを知っている必要があります。を使用'latin-1'すると、エラーはなくなりますが、テキストが実際にLatin-1でない場合は、完全に意味不明なものになる可能性があります。
tripleee

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

Python 2の場合:

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

Python 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は便利な例ですが、入力として「16進数」を変換していませんが、整数を16進数文字列に変換しています。コードはでも同様に機能しprint convert_hex_to_ascii(123456)ます。
マークラカタ2013年

5

または、これを行うこともできます...

Python 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:~# 

または

Python 2ワンライナー

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

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

Python 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

Python 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
これはスペースがなくても正常に機能し、python3でprint()を使用すると正常に機能します。
rjferguson

はい、見やすくするためにわざとつけました。Python 3でも回答を更新します。
サブリナ

3

Python 3.3.2でテスト済みこれを行うには多くの方法があります。以下に、Pythonが提供するもののみを使用した、最も短い方法の1つを示します。

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.