পাইথনের বাইট অ্যারেতে হেক্সাডেসিমাল স্ট্রিং


150

আমার কাছে একটি দীর্ঘ হেক্স স্ট্রিং রয়েছে যা বিভিন্ন ধরণের মানের একটি ধারা উপস্থাপন করে। আমি এই হেক্স স্ট্রিংকে একটি বাইট অ্যারে রূপান্তর করতে চাই যাতে প্রতিটি মানটি স্থানান্তরিত করে এটির যথাযথ ডেটা টাইপে রূপান্তর করতে পারি।


সেই হেক্স স্ট্রিংটি কেমন দেখাচ্ছে?
খচিক

উত্তর:


239

মনে করুন আপনার হেক্স স্ট্রিংটি এরকম কিছু

>>> hex_string = "deadbeef"

এটিকে স্ট্রিংয়ে রূপান্তর করুন (পাইথন ≤ 2.7):

>>> hex_data = hex_string.decode("hex")
>>> hex_data
"\xde\xad\xbe\xef"

বা পাইথন ২.7 এবং পাইথন ৩.০ থেকে:

>>> bytes.fromhex(hex_string)  # Python ≥ 3
b'\xde\xad\xbe\xef'

>>> bytearray.fromhex(hex_string)
bytearray(b'\xde\xad\xbe\xef')

bytesএটি একটি অপরিবর্তনীয় সংস্করণ নোট bytearray


27
যদি কেউ হেক্স string-> bytesঅবজেক্টের সন্ধান করে তবে এটি `বাইটস.ফ্রমেহেক্স (" 000102030405060708090A0B0C0D0E0F ") yield যা দেয় b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'। প্রশ্নটি বাইট অ্যারের জন্য জিজ্ঞাসা করায় একটি উত্তর হিসাবে পোস্ট করা হচ্ছে না, তবে বাইটে হেক্সট অনুসন্ধানের সময় এটি আমার প্রথম আঘাত হওয়ায় এটি এখানে পোস্ট করা।
ম্যাট্রিক্সনোমালি

@ হুব্রো আসলে hex_string.decode("hex")পাইথন ২.7 এ কাজ করছে। আমি শুধু আমার উপর পরীক্ষা Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
MewX

@ মেভেক্স আমি পাইথন 3 বলেছিলাম, পাইথন ২.on নয়
হুব্রো

3
নোট যে bytes.fromhexযখন ইনপুট স্ট্রিং অক্ষরের একটি বিজোড় সংখ্যা হয়েছে একটি ত্রুটি ছোঁড়া: bytes.fromhex("aab")ValueError: non-hexadecimal number found in fromhex() arg at position 3
35

143

বাইটায়ারে একটি অন্তর্নির্মিত ফাংশন রয়েছে যা আপনার ইচ্ছা অনুযায়ী করে।

bytearray.fromhex("de ad be ef 00")

এটি একটি বাইটায়ারে ফিরিয়ে দেয় এবং এটি স্পেস বিভাজক বা তার সাথে ছাড়াই হেক্স স্ট্রিং পড়তে পারে।


4
অবশ্যই সেরা উত্তর!
মাইকু মরি

5
এটি পাইথন 3 এ কাজ hex_string.decode("hex")করে , যেখানে নেই।
এরিক হে লেবিগোট

15

আমি যদি সঠিকভাবে বুঝতে পারি তবে আপনার বিন্যাসি.ইনহেক্সলিফের সন্ধান করা উচিত

import binascii
a='45222e'
s=binascii.unhexlify(a)
b=[ord(x) for x in s]

4
সে ব্যাপারে আমি সম্মত unhexlifyএখানে যান সবচেয়ে কার্যকর উপায়, কিন্তু সুপারিশ করবে যে b = bytearray(s)ব্যবহার তুলনায় ভালো হবে ord। পাইথনের যেহেতু কেবল বাইটের অ্যারেগুলির জন্য একটি অন্তর্নির্মিত টাইপ রয়েছে তাই আমি অবাক হয়েছি যে কেউ এটি ব্যবহার করছে না
স্কট গ্রিফিথস

8

ধরে নিচ্ছি আপনার কাছে বাইট স্ট্রিং রয়েছে

"\ X12 \ x45 \ x00 \ xAB"

এবং আপনি কীভাবে বাইটস এবং তার ধরণের পরিমাণ জানেন তা আপনি এই পদ্ধতির ব্যবহার করতে পারেন

import struct

bytes = '\x12\x45\x00\xAB'
val = struct.unpack('<BBH', bytes)

#val = (18, 69, 43776)

আমি যেমন বিন্যাসের স্ট্রিংয়ের শুরুতে সামান্য এন্ডিয়ান ('<' চরিত্রের ব্যবহার করে) নির্দিষ্ট করেছি ফাংশনটি দশমিক সমতুল্য ফিরে পেয়েছে।

0x12 = 18

0x45 = 69

0xAB00 = 43776

বি স্বাক্ষরযুক্ত এক বাইট (8 বিট) এর সমান

এইচ দুটি বাইট (16 বিট) স্বাক্ষরবিহীন সমান

আরও উপলব্ধ অক্ষর এবং বাইট মাপ এখানে পাওয়া যাবে

সুবিধাগুলি হ'ল ..

আপনি একাধিক বাইট এবং মানগুলির শেষটি নির্দিষ্ট করতে পারেন

অসুবিধেও ..

আপনার ডিলের ধরণ এবং দৈর্ঘ্যটি সত্যই আপনার জানা উচিত


2
অসুবিধাগুলি: এটি একটি বাইট স্ট্রিং, হেক্স স্ট্রিং নয়, সুতরাং এটি প্রশ্নের উত্তর নয় to
qris

এটি প্রশ্নের দ্বিতীয় অংশের একটি উত্তর "... যাতে আমি প্রতিটি মান সরিয়ে আনি এবং এটির যথাযথ ডেটা টাইপে রূপান্তর করতে পারি"।
রেনাল্ড 62

2

আপনি বাইনারি ডেটা ধরে এমন স্ট্রিং তৈরি করতে সক্ষম হবেন যেমন:

data = "fef0babe"
bits = ""
for x in xrange(0, len(data), 2)
  bits += chr(int(data[x:x+2], 16))

এটি সম্ভবত দ্রুততম উপায় নয় (অনেকগুলি স্ট্রিং সংযোজন), তবে কেবল মূল পাইথন ব্যবহার করে বেশ সহজ।




-4

একটি ভাল একটি লাইনার হ'ল:

byte_list = map(ord, hex_string)

এটি স্ট্রিংয়ের প্রতিটি চরকে পুনরাবৃত্তি করবে এবং এটি অর্ড () ফাংশনের মাধ্যমে চালাবে। শুধুমাত্র পাইথন ২.6 এ পরীক্ষা করা হয়েছে, 3.0+ সম্পর্কে খুব বেশি নিশ্চিত নয়।

-Josh


নিখুঁত। অজগর ২.7 এ কাজ করছেন
রিচার্ড

এই উত্তরের পাশে চেকমার্কের রূপরেখায় ক্লিক করুন যদি এটি সঠিক হয়! :)
jathanism

1
এটি হেক্সকে রূপান্তর করে না - এটি স্ট্রিংয়ের প্রতিটি চরিত্রকে পূর্ণসংখ্যায় রূপান্তর করে। হেক্সের জন্য প্রতিটি জোড়া অক্ষর একটি বাইট উপস্থাপন করবে। আপনি সম্ভবত ঠিক বলেছেনbyte_list = bytearray(hex_string)
স্কট গ্রিফিথস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.