ASCII स्ट्रिंग से कन्वर्ट करने के लिए हेक्स में सादे ASCII?


146

मैं पायथन में हेक्स से सादे ASCII में कैसे परिवर्तित कर सकता हूं?

ध्यान दें कि, उदाहरण के लिए, मैं "0x7061756c" को "पाउल" में बदलना चाहता हूं।


मैंने अपने यहाँ मिले सामान का एक गुच्छा आज़माया
पॉल

1
लिंक की मदद से आपने बस हमें दिया, मुझे वह फ़ंक्शन मिला जिसकी आप तलाश कर रहे थे। आपने वास्तव में क्या प्रयास किया और यह काम क्यों नहीं किया?
विन्सेन्ट सवार्ड

1
मैंने निम्नलिखित की कोशिश की: >>> binascii.b2a_hqx ("0x7061756c") '- (Jh- $ Ba0c8fB`' >>> binascii.b2a__u ("0x7061756c") "*, '@,' W, # 8Q-S4V8P8P >>> binascii.b2a_base64 ( "0x7061756c") 'MHg3MDYxNzU2Yw == \ n' >>> binascii.b2a_qp ( "0x7061756c") '0x7061756c' >>> binascii.b2a_hex ( "0x7061756c") '30783730363137353663' >>> binascii .b2a_hex (0x7061756c) ट्रेसबैक (सबसे हालिया कॉल अंतिम): फ़ाइल "<stdin>", पंक्ति 1, में <मॉड्यूल> टाइप करें: स्ट्रिंग या बफर होना चाहिए, int नहीं >>>
पॉल रेइनर्स

उनमें से किसी ने भी काम नहीं किया, क्योंकि उनमें से किसी ने भी 'पाऊल' नहीं लौटाया।
पॉल रीनर्स

2
क्या आपका मतलब "7-बिट" ASCII नहीं है? (जो मूर्खतापूर्ण है क्योंकि ASCII केवल 7-बिट है।) एक GUID 128 बिट है ...

जवाबों:


231

थोड़ा सरल समाधान:

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

142
.decode('hex')पाइथन 3 पर कोई नहीं है । पाइथन 2 .decode('hex')का उपयोग करता हैbinascii.unhexlify()
jfs

2
यह इंगित करने के लिए धन्यवाद, मैं अजगर 3 से परिचित नहीं हूं। यह समाधान 1 में भी काम नहीं करेगा जहां तक ​​मैं जानता हूं।
cjm

26
codecs.decode("7061756c", "hex")पायथन 2 और पायथन 3 के लिए काम करता है। लेकिन यह bytes()पायथन 3 में एक स्ट्रिंग देता है। लेकिन यह एक ASCII स्ट्रिंग के लिए उचित है।
मार्क इवांस

100

किसी भी पुस्तकालय को आयात करने की आवश्यकता नहीं है:

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

2
मेरे लिए सबसे अच्छा समाधान (अजगर 3 के साथ काम करता है) क्योंकि यह रिक्त स्थान को भी स्वीकार करता है:bytearray.fromhex("70 61 75 6C").decode()
जोना

bytearray.fromhex " समझा! धन्यवाद!
ग्रैम्बो

बेशक आपको डेटा की वास्तविक एन्कोडिंग को जानना होगा अगर इसे पाठ के रूप में व्याख्या करना है। उपयोग 'latin-1'करने से किसी भी त्रुटि से छुटकारा मिल जाएगा, लेकिन अगर पाठ वास्तव में लैटिन -1 नहीं है तो पूरी तरह से जीवंतता पैदा कर सकता है।
ट्रिपलए

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
' '

अब बिन्यासी को देखेंगे ...

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

शांत (और मुझे पता नहीं है कि अन्य लोग क्यों आपको मदद करने से पहले हुप्स के माध्यम से कूदना चाहते हैं)।


16

पायथन 2 में:

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

पायथन 3 में:

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

5

यहाँ हेक्स पूर्णांक और हेक्स स्ट्रिंग्स के साथ काम करते समय मेरा समाधान है:

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, लेकिन आप "हेक्स" को इनपुट के रूप में परिवर्तित नहीं कर रहे हैं लेकिन आप किसी भी पूर्णांक को हेक्स स्ट्रिंग में परिवर्तित कर रहे हैं। आप कोड के साथ भी समान रूप से काम करेंगे 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
यह रिक्त स्थान के बिना भी ठीक काम करता है, और प्रिंट () के साथ python3 में ठीक काम करता है।
rjferguson

हां, मैंने इसे आसानी से देखने के उद्देश्य से रखा था। मुझे पायथन 3 के साथ ही उत्तर को अपडेट करने दें।
सबरीना

3

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.