2012-03-09 10 views
93

मैं पाइथन में हेक्स से सादा ASCII में कैसे परिवर्तित कर सकता हूं?हेक्स में एएससीआईआई एसीसीआईआई में एन्कोडेड एएससीआईआई स्ट्रिंग से कनवर्ट करें?

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

+0

मैं सामान मैं यहां पाया के एक झुंड की कोशिश की है: http://docs.python.org/library/ binascii.html –

+1

लिंक की सहायता से आपने हमें अभी दिया है, मुझे वह फ़ंक्शन मिला है जिसे आप ढूंढ रहे थे। आपने क्या _exactly_ कोशिश की और यह क्यों काम नहीं किया? –

+0

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

उत्तर

177

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

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

पायथन 3 पर 'डीकोड (' हेक्स ') नहीं है। ['। डीकोड (' हेक्स ')' उपयोग पायथन 2 पर 'binascii.unhexlify() '(http://hg.python.org/cpython/file/2.7/Lib/encodings/hex_codec.py#l27)। – jfs

+1

यह इंगित करने के लिए धन्यवाद कि मैं पाइथन 3 से परिचित नहीं हूं। यह समाधान 1 तक काम नहीं करेगा जहां तक ​​मुझे पता है। – cjm

+11

'codecs.decode (" 7061756c "," हेक्स ") 'पायथन 2 और पायथन 3 के लिए काम करता है। लेकिन यह पायथन 3 में' बाइट्स()' स्ट्रिंग देता है लेकिन यह ASCII स्ट्रिंग के लिए उचित है। एक उपयोगी उदाहरण के लिए –

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

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

4

यहाँ मेरी समाधान है जब हेक्स पूर्णांक और नहीं हेक्स तार के साथ काम:

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) 
+0

+1, लेकिन आप इनपुट के रूप में "हेक्स" को परिवर्तित नहीं कर रहे हैं लेकिन आप किसी भी पूर्णांक को हेक्स स्ट्रिंग में परिवर्तित कर रहे हैं। आप कोड 'print convert_hex_to_ascii (123456) 'के साथ-साथ समान रूप से काम करेंगे। –

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

किसी भी पुस्तकालय आयात करने के लिए कोई ज़रूरत नहीं:

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

मेरे लिए सबसे अच्छा समाधान के रूप में तो यह और भी रिक्त स्थान को स्वीकार करता है (अजगर 3 के साथ काम करता है):।। 'Bytearray.fromhex (" 70 61 75 6C ") को डिकोड()' – Jona

+0

bytearray.fromhex ("70e4756c") को डिकोड (एन्कोडिंग = "लेटिन 1 ") 'पॉल' हम में से उन द्विआधारी में खेल, विस्तारित वर्ण डिफ़ॉल्ट पर गला घोंटना utf-8 डिकोड, उसके अलावा, यह सबसे पोर्टेबल जवाब मैं देख रहा हूँ है! धन्यवाद! – grambo

संबंधित मुद्दे