দীর্ঘ হেক্স স্ট্রিং থেকে কীভাবে পাইথন বাইটস অবজেক্ট তৈরি করবেন?


90

আমার কাছে স্ট্রিংতে হেক্স ডিজিটের দীর্ঘ ক্রম রয়েছে, যেমন

000000000000484240FA063DE5D0B744ADBED63A81FAEA390000 C8428640A43D5005BD44

কেবল অনেক দীর্ঘ, কয়েক কিলোবাইট। পাইথন ২.6 / ৩-তে বাইট অবজেক্টে এটিকে রূপান্তর করার কোনও অন্তর্নির্মিত উপায় আছে?


4
নোট করুন যে নীচের উত্তরগুলি দেখতে একই রকম হতে পারে তবে তারা বিভিন্ন ধরণের মান দেয়। s.decode ('hex') একটি str প্রদান করে, যেমন unhexlify (গুলি) করে। bytearray.fromhex (গুলি) একটি বাইটারি প্রদান করে। এই প্রশ্নের শব্দটি দেওয়া, আমি মনে করি যে বড় সবুজ চেকমার্কটি বাইটারে.ফ্রোমেক্স (গুলি) এর উপর হওয়া উচিত, এস.ডাইকোড ('হেক্স') এ নয়।
পল হফম্যান


4
এটি কীভাবে 2 বছর পরে তৈরি করা প্রশ্নের সদৃশ হতে পারে?
পুনরাবৃত্তি

4
@CiroSantilli 郝海东 冠状 病 六四 事件 法轮功 একটি বাইট স্ট্রিং বাইট অ্যারে নয় stackoverflow.com/questions/1740696/...
LarsH

@ লার্শ মেলা যথেষ্ট। @ রিকার্সিভ: তারিখটি মূল কারণ নয়: meta.stackexchange.com/questions/147643/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

উত্তর:


95

পাইথন ২.7 এবং পাইথন 3 সহ উচ্চতরগুলিতে কাজ করে:

result = bytearray.fromhex('deadbeef')

দ্রষ্টব্য:bytearray.fromhex() পাইথন ২.6- এ ফাংশনটি সহ একটি বাগ রয়েছে বলে মনে হচ্ছে । পাইথন.অর্গ ডকুমেন্টেশন বলে যে ফাংশনটি একটি স্ট্রিংটিকে আর্গুমেন্ট হিসাবে গ্রহণ করে, তবে প্রয়োগ করা হলে নিম্নলিখিত ত্রুটিটি নিক্ষেপ করা হয়:

>>> bytearray.fromhex('B9 01EF')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: fromhex() argument 1 must be unicode, not str`

9
এবং আরও একটি পদক্ষেপ, আমি একটি বাইট স্ট্রিং চেয়েছিলাম (যেমন পাইথন 3 এর বি '\ x04 \ xea [...]'), যা আপনি বাইটারে থেকে পেতে পারেনbytes(bytearray.fromhex('deadbeef'))
বার্তো

4
@ বার্তো: সেক্ষেত্রে আরও একটি সরাসরি রুট রূপে রয়েছে binascii.unhexlify()
মার্টিজন পিটারস

4
ধন্যবাদ, @ মার্তিজন পিটারস, আমি এটিকে একটি শট দেব
বার্তো

4
এই উত্তরটি প্রশ্নটি যা করে তা করে না। এটি একটি অজগর বাইট্রেস্টিং নয়, বাইটের একটি পরিবর্তনীয় অ্যারে প্রদান করে। এটি স্ট্রিংয়ের চেয়ে স্ট্রিংগুলির অ্যারের ফিরিয়ে দেওয়ার মতো।
মাইক মার্টিন

4
@ লার্শ: এই পদ্ধতিটি পুরানো পাইথন 2 রিলিজে উপলভ্য নয়। এটি আজ আর কোনও বিষয় নয়, তবে এটি ছিল 2016 সালের একটি সমস্যা
মার্টিজান পিটার

74
result = bytes.fromhex(some_hex_string)

4
এটি আসল পোস্টটি যা জিজ্ঞাসা করছে তা করার সর্বাধিক প্রত্যক্ষ উপায় বলে মনে হচ্ছে। এটি গ্রহণযোগ্য উত্তর না হওয়ার কোনও কারণ আছে?
সেবাস্তিয়ান গাওদা

যখন হেক্স সংখ্যাগুলি ফাঁক দিয়ে পৃথক করা হয় তখন থেকে ফেক্স () পদ্ধতি (উভয় বাইট এবং বাইটারি উভয়ের )ও কাজ করবে। খুব সুবিধাজনক!
ক্লোস

4
এটি সত্যই গ্রহণযোগ্য উত্তর হওয়া উচিত। বর্তমান গৃহীত উত্তর প্রশ্নটি যা বলে তা করে না। এটি বাইটিংয়ের পরিবর্তে বাইটের পরিবর্তনীয় অ্যারে প্রদান করে।
মাইক মার্টিন

40

আপনি হেক্স কোডেক দিয়ে এটি করতে পারেন। অর্থাত:

>>> s='000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44'
>>> s.decode('hex')
'\x00\x00\x00\x00\x00\x00HB@\xfa\x06=\xe5\xd0\xb7D\xad\xbe\xd6:\x81\xfa\xea9\x00\x00\xc8B\x86@\xa4=P\x05\xbdD'

16
codecs.decode('0a0a0a', 'hex_codec')2.x এবং 3.x :
আব্বাফাই

37

ব্যবহার করে দেখুন binascii মডিউল

from binascii import unhexlify
b = unhexlify(myhexstr)

9
এটি 2.x তে করার দুটি উপায়, 3.x তে তিনটি উপায় তাই অনেক ... "সেখানে শুধুমাত্র একটি উপায় এটা করতে" -এর জন্য
technomalogical

অন্যান্য দুটি উপায় আরও 'অন্তর্নির্মিত' তাই আমি আসলে এর মধ্যে একটি ব্যবহার করব।
ক্রিসেন্ট ফ্রেশ

@ টেকনোম্লোগিকাল: আপনার মন্তব্য উত্তরটির সাথে অপ্রাসঙ্গিক; সম্ভবত আপনার এটি মুছে ফেলা উচিত এবং এটি একটি পোস্টে comp.lang.python এ পরিবর্তন করা উচিত।
tzot

4
@ টেকনোম্লোগিকাল: আমি with এর সাথে একমত এছাড়াও, আপনি এটি ভুল পেয়েছি। সঠিক বাক্যাংশটি হ'ল: একটি থাকতে হবে - এবং কেবলমাত্র একটিই - এটি করার সুস্পষ্ট উপায়।
nosklo

4
দ্রষ্টব্য যে পাইথন ৩.২-এ (ডিজাইনের মাধ্যমে বা বাগের মাধ্যমে আমি নিশ্চিত নই) unhexlifyএখন কোনও স্ট্রিং গ্রহণ করবে না, তবে কেবল বাইটস। খুব সুন্দর নির্বোধ, তবে এর অর্থ আপনার ব্যবহার করা দরকারb = unhexlify(bytes(myhexstr, 'utf-8'))
স্কট গ্রিফিথস


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.