الخميس، 7 نوفمبر 2024

4 طرق بايثونية لتحويل HEX إلى ASCII

 في هذه المقالة، ستتعلم كيفية تحويل قيم HEX إلى سلسلة ASCII في Python.

ولجعل الأمر أكثر متعة، لدينا السيناريو التالي:

قررت شركة Carrier Coders عرض اقتباس اليوم على موقعها الإلكتروني. يتم إرسال كل اقتباس يوميًا بقيم HEX. تتمثل مهمتك في تحويل الاقتباس إلى سلسلة ASCII وتنسيق الناتج.

💬 السؤال: كيف نكتب كود بايثون لإجراء التحويل وعرض الاقتباس عشوائيًا؟


يمكننا إنجاز هذه المهمة من خلال أحد الخيارات التالية:

  • الطريقة 1: استخدام fromhex() و decode()
  • الطريقة 2: استخدم codecs.decode()
  • الطريقة 3: استخدم join()
  • الطريقة 4: استخدم binascii.a2b_hex()
  • المكافأة: إنشاء اقتباس عشوائي

أضف الكود التالي إلى أعلى كل مقتطف من الكود. سيسمح هذا المقتطف للكود الموجود في هذه المقالة بالعمل دون أخطاء.

1
2
3
import codecs
import binascii
import random

الطريقة 1: استخدام ()fromhex و ()decode

تعمل الدالتان fromhex() وdecode() بشكل جيد لتحويل قيم HEX إلى سلسلة ASCII. ولا تتطلب هذه الطريقة أي مكتبات إضافية.

1
2
3
4
quote_h = "4368616e67696e67206a6f62732064756520746f20636f2d776f726b6572733f205768793f205468652073616d652070656f706c6520776f726b2074686572652e3b57616c6c79204d6f6f7265"
quote_a = bytes.fromhex(quote_h).decode("ASCII")
quote   = quote_a.replace(';', '\n- ')
print(quote)

يأخذ الكود المميز قيم HEX، ويحولها إلى كائن بايت باستخدام fromhex()، ثم يحولها إلى سلسلة ASCII عن طريق إضافة decode() إلى النهاية. إذا تم إخراج quote_a إلى الطرفية، فسيتم عرض ما يلي:

1
Changing jobs due to co-workers? Why? The same people work there.;Wally Moore

لتنظيف الناتج، يتم استخدام replace() في quote_a لاستبدال الفاصلة المنقوطة بسطر جديد وواصلة. يتم حفظ النتيجة في quote_a.

الناتج

1
2
Changing jobs due to co-workers? Why? The same people work there.
- Wally Moore

الطريقة 2: استخدم ()codecs.decode

يتطلب هذا السطر الواحد مكتبة برامج codecs للتحويل، والتي تحتوي على فئات أساسية لترميز وفك تشفير البيانات. تُستخدم عادةً في الملفات النصية المبنية على Unicode.

1
2
3
4
quote_h  = "4d7920736f667477617265206e657665722068617320627567732e204974206a75737420646576656c6f70732072616e646f6d2066656174757265732e3b416e6f6e796d6f7573"
quote_a  = codecs.decode(quote_h, 'hex').decode("ASCII")
quote    = quote_a.replace(';', '\n- ')
print(quote)

يأخذ الكود المميز قيم HEX ويحولها إلى كائن بايت باستخدام codecs.decode()، ثم يحولها إلى سلسلة ASCII عن طريق إلحاق decode() في النهاية.

إذا تم إخراج quote_a إلى الطرفية، فسيتم عرض ما يلي:

1
b'My software never has bugs. It just develops random features.;Anonymous'

لتنظيف الناتج، يتم استخدام replace() في quote_a لاستبدال الفاصلة المنقوطة بسطر جديد وواصلة. يتم حفظ النتيجة في الاقتباس.

الناتج

1
2
My software never has bugs. It just develops random features.
- Anonymous

الطريقة 3: استخدم ()join

يقوم سطر واحد فعال يقرأ قيمة HEX واحدة في كل مرة بتحويلها إلى حرف ASCII وإضافتها إلى نهاية المتغير. يتكرر هذا حتى اكتمال التحويل.

1
2
3
quote_h = "4c696665206973206e6f742061626f75742066696e64696e6720796f757273656c662e204c6966652069732061626f7574206372656174696e6720796f757273656c662e3b47656f726765204265726e6172642053686177"
quote   = ''.join([chr(int(''.join(c), 16)) for c in zip(quote_h[0::2],quote_h[1::2])]).replace(';', '\n- ')
print(quote)

يأخذ الكود المميز قيمة HEX واحدة، وباستخدام zip()، يحول القيمة المذكورة إلى ما يعادلها من ASCII. ثم يتم إلحاق الأحرف بمتغير الاقتباس لإنشاء سلسلة ASCII كاملة. وأخيرًا، يتم إلحاق replace() في النهاية لإجراء التنسيق.

الناتج

1
2
Life is not about finding yourself. Life is about creating yourself.
- George Bernard Shaw

الطريقة 4: استخدم binascii.a2b_hex

يستدعي هذا السطر الواحد مكتبة binascii لتحويل قيم HEX إلى سلسلة ASCII باستخدام دالة binascii.a2b_hex().

1
2
3
quote_h = "446f206e6f74207365656b206120706c61636520746f20626c6f6f6d3a20626c6f6f6d20776865726520796f752061726520706c616e7465642e3b57616c6c79204d6f6f7265"
quote = binascii.a2b_hex("%s" % (quote_h.strip())).decode("ASCII").replace(';', '\n- ')
print(quote)

يأخذ الكود المميز قيم HEX ويحولها إلى ما يعادلها بصيغة ASCII. وأخيرًا، يتم إلحاق replace() في النهاية لإجراء التنسيق.

الناتج

1
2
Do not seek a place to bloom: bloom where you are planted.
- Wally Moore

المكافأة: إنشاء اقتباس عشوائي

قد يكون النهج الأكثر فعالية للتعامل مع ما سبق هو وضع كل الاقتباسات في ملف نصي مسطح. ثم تحديد الاقتباس اليومي بشكل عشوائي وتحويله وتنسيقه بالشكل المناسب.

1
2
3
4
5
6
7
8
9
10
quotes = []
 
with open('hex-quotes.txt','r') as fp:
    for index, line in enumerate(fp):
        line = bytes.fromhex(line).decode("ASCII").strip()
        quotes.append(line)
 
num = random.randint(0, len(quotes)-1)
daily = quotes[num].replace(';', '\n- ')
print(daily)

يتكرر الكود أعلاه عبر أسطر ملف الاقتباسات. أولاً، يتم تحويل كل سطر من قيم HEX إلى ما يعادله من سلسلة ASCII باستخدام fromhex() وdecode(). بعد ذلك، يتم إلحاق السلسلة المحولة بقائمة الاقتباسات.

يتم إنشاء رقم عشوائي والإشارة إليه في قائمة الاقتباسات. وأخيرًا، يتم تنسيق الناتج وإرساله إلى الطرفية.

الناتج

1
2
Life is like a box of chocolates, you never know what you are going to get.
- Forrest Gump

يجب أن توفر لك هذه الطرق الأربع (4) لتحويل قيم HEX إلى سلسلة ASCII معلومات كافية لاختيار الطريقة الأفضل لمتطلبات الترميز الخاصة بك.

ليست هناك تعليقات:

إرسال تعليق

😂11 مكتبة بايثون ممتعة لجعل يومك أفضل☀️

  في هذه المقالة سأقدم لك 11 مكتبة استمتعت باللعب بها وفكرت في مشاركتها معك.