Hex এ এনকোডযুক্ত ASCII স্ট্রিং থেকে প্লেইন ASCII তে রূপান্তর করবেন?


146

আমি কীভাবে পাইথনের হেক্স থেকে প্লেইন এএসসিআই তে রূপান্তর করতে পারি?

নোট করুন, উদাহরণস্বরূপ, আমি "0x7061756c" "পল" এ রূপান্তর করতে চাই।


আমি এখানে একটি গুচ্ছ জিনিস চেষ্টা করেছি: docs.python.org/library/binascii.html
পল

1
আপনি সবেমাত্র আমাদের দেওয়া লিঙ্কটির সাহায্যে, আপনি যে ফাংশনটি সন্ধান করছেন তা পেয়েছি। আপনি ঠিক কী চেষ্টা করেছিলেন এবং কেন এটি কার্যকর হয়নি?
ভিনসেন্ট সাভার্ড

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' >>> বাইনাসি.বি 2 '61 '353303 ">" 30x' (30x130335) ""xxiibb .b2a_hex (0x7061756c) ট্রেসব্যাক (সর্বশেষতম কল শেষ): ফাইল "<stdin>", লাইন 1, <মডুল> টাইপ এরর: অবশ্যই স্ট্রিং বা বাফার হতে হবে, >>> না
পল রেইনার্স

তাদের কেউই কাজ করেনি, কারণ তাদের কেউই 'পল' ফেরেনি।
পল রেইনার্স

2
আপনি কি "7-বিট" ASCII বোঝাতে চাইছেন না? (যা

উত্তর:


231

একটি সামান্য সহজ সমাধান:

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

142
সেখানে নেই .decode('hex')উপর পাইথন 3. .decode('hex')ব্যবহারসমূহ binascii.unhexlify()পাইথন 2
jfs

2
এটি উল্লেখ করার জন্য ধন্যবাদ, আমি পাইথন 3 এর সাথে তেমন পরিচিত নই This এই সমাধানটি আমি যতদূর জানি 1 তে কাজ করবে না।
সিজেএম

26
codecs.decode("7061756c", "hex")পাইথন 2 এবং পাইথন 3 এর জন্য কাজ করে তবে এটি bytes()পাইথন 3 এ স্ট্রিং দেয় But তবে এটি ASCII স্ট্রিংয়ের পক্ষে যুক্তিসঙ্গত।
ইভান্স

100

কোনও লাইব্রেরি আমদানি করার দরকার নেই:

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

2
আমার পক্ষে সেরা সমাধান (পাইথন 3 নিয়ে কাজ করে) যেমন এমনকি এটি স্পেসগুলিও গ্রহণ করে:bytearray.fromhex("70 61 75 6C").decode()
জোনা

bytearray.fromhex ("70e4756c")। ডিকোড (এনকোডিং = "ল্যাটিন 1") 'পল' আমাদের মধ্যে যারা বাইনারি খেলছেন তাদের জন্য বর্ধিত অক্ষরগুলি ডিফল্ট utf-8 ডিকোডের উপরে চাপ দেয়, এগুলি ছাড়া, এটি সর্বাধিক বহনযোগ্য উত্তর আমি দেখি! ধন্যবাদ!
গ্র্যাম্বো

অবশ্যই আপনাকে ডেটাটির প্রকৃত এনকোডিংটি জানতে হবে যদি এটি পাঠ্য হিসাবে ব্যাখ্যা করা যায়। ব্যবহারটি 'latin-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

শীতল (এবং অন্যান্য লোকেরা কেন সাহায্য করার আগে আপনাকে হুফ দিয়ে ঝাঁপিয়ে পড়তে চায় তা আমার কোনও ধারণা নেই)।



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
এটি ফাঁকা স্থান ছাড়াও সূক্ষ্মভাবে কাজ করে এবং প্রিন্ট () সহ পাইথন 3 এ সূক্ষ্মভাবে কাজ করে।
rjferguson

হ্যাঁ, এটি দেখার পক্ষে আরও সহজ করার উদ্দেশ্যে আমি এটিকে রেখেছি। আমি পাইথন 3 এর সাথে উত্তরও আপডেট করি।
সাবরিনা

3

পাইথন ৩.৩.২ এ পরীক্ষিত এটি সম্পন্ন করার জন্য অনেকগুলি উপায় রয়েছে, এখানে কেবলমাত্র পাইথন-সরবরাহিত সামগ্রী ব্যবহার করে সংক্ষিপ্ততম একটি here

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.