पायथन 3 में बाइट्स को हेक्स स्ट्रिंग में बदलने का सही तरीका क्या है?


235

पायथन 3 में बाइट्स को हेक्स स्ट्रिंग में बदलने का सही तरीका क्या है?

मुझे एक bytes.hexविधि, bytes.decodeकोडेक्स के दावे दिखाई देते हैं , और बिना किसी लाभ के कम से कम विस्मय के अन्य संभावित कार्यों की कोशिश की है । मैं सिर्फ हेक्स के रूप में अपने बाइट्स चाहता हूँ!


"बिना लाभ के"? आपको क्या विशिष्ट समस्याएं या त्रुटियां मिल रही हैं? कृपया कोड और त्रुटियां दिखाएं।
सल।

के संभावित डुप्लिकेट stackoverflow.com/questions/2340319/python-3-1-1-string-to-hex
म्यू मन

जवाबों:


409

पायथन 3.5 के बाद से यह अंत में अजीब नहीं है:

>>> b'\xde\xad\xbe\xef'.hex()
'deadbeef'

और रिवर्स:

>>> bytes.fromhex('deadbeef')
b'\xde\xad\xbe\xef'

परिवर्तनशील bytearrayप्रकार के साथ भी काम करता है ।

संदर्भ: https://docs.python.org/3/library/stdtypes.html#bytes.hex


5
bytes.fromhex()पायथन 3.0+ (सिर्फ 3.5+ नहीं) पर भी उपलब्ध है। bytes.hex()केवल पायथन 3.5+ पर है।
फीनिक्स

95

binasciiमॉड्यूल का उपयोग करें :

>>> import binascii
>>> binascii.hexlify('foo'.encode('utf8'))
b'666f6f'
>>> binascii.unhexlify(_).decode('utf8')
'foo'

इस उत्तर को देखें: अजगर 3.1.1 स्ट्रिंग से हेक्स


8
यह अच्छा है। माइंड बोगलिंग यह है कि आप बाइट्स को बाइट्स में बदल कर बाइट्स का उपयोग कर सकते हैं। फरहेक्स (हेक्स_स्ट्रस्ट), लेकिन बाइट्स को आप बाइट्स को बाइट्स में परिवर्तित नहीं कर सकते। बाइटेक्स () - इसमें तर्कसंगत क्या है?
नागालिज 21

1
मुझे लगता है कि बाइट्स और हेक्स के बीच संबंध या तो एक संपत्ति नहीं है (जो जवाब नहीं देता है कि बीफ क्यों है)। ऐसा लगता है कि यह सिर्फ एक निरीक्षण नहीं था, लेकिन कुछ ऐसा था जिस पर तर्क दिया गया था: bugs.python.org/issue3532#msg70950 । प्रश्न: क्या इस कार्य को करने के लिए बाइट ऑब्जेक्ट के टॉक्स विधि से चोट लगी होगी? एक: IMO, हाँ, यह होगा। यह कोड को उलझाता है, और फोकस को उचित दृष्टिकोण से दूर डेटा रूपांतरण (अर्थात्, फ़ंक्शन - विधियों नहीं) से खींचता है।
म्यू माइंड

3
क्या यह वास्तव में सवाल का जवाब देता है? यह एक हेक्स वापस नहीं करता है strलेकिन ए bytes। मुझे पता है कि ओपी जवाब से खुश है, लेकिन इस जवाब को .decode("ascii")"स्ट्रिंग" में बदलने के लिए इसे शामिल करना भी बेहतर नहीं होगा
RubenLaguna

3
मैं सोच रहा था कि बहुत से लोग इस सवाल / जवाब पर उतरते हैं कि प्रिंटआउट का रास्ता क्या है bytes। अगर आपको प्रिंटआउट print(b'666f6f')मिल जाता bहै। यदि आप .decode("ascii")तो आप नहीं करते हैं। बस यह सोचकर कि जो वास्तव में एक bytesआइटम (128, आइटम नहीं एससीआई स्ट्रिंग के साथ एक द्विआधारी) था, वह इसे प्रिंट करना चाहता था।
रुबेनलागुन

5
@nagylzs: .hex()पाइथन 3.5+ में विधि है
15:24 पर

43

पायथन में बाइट्स-टू-बाइट्स मानक कोडेक्स हैं जो उद्धृत-प्रिंट करने योग्य (7bit ascii में फिट बैठता है), बेस 64 (अल्फ़ान्यूमेरिक्स में फिट बैठता है), हेक्स एस्केपिंग, गज़िप और b22 संपीड़न जैसे सुविधाजनक रूपांतरण करते हैं। पायथन 2 में, आप यह कर सकते हैं:

b'foo'.encode('hex')

पायथन 3 में, str.encode/ bytes.decodeबाइट्स के लिए कड़ाई से <-> कड़े रूपांतरण हैं। इसके बजाय, आप ऐसा कर सकते हैं, जो कि पायथन 2 और पाइथन 3 ( एस / एनकोड / डीकोड / उलटा के लिए जी ) पर काम करता है:

import codecs
codecs.getencoder('hex')(b'foo')[0]

पायथन 3.4 के साथ शुरू, एक कम अजीब विकल्प है:

codecs.encode(b'foo', 'hex')

ये मिक्स कोडेक्स अपने स्वयं के मॉड्यूल (बेस 64, ज़्लिब, बीज़ 2, यूयू, क्वोप्री, बिनसाइसी) के अंदर भी सुलभ हैं; एपीआई कम सुसंगत है, लेकिन संपीड़न कोडेक्स के लिए यह अधिक नियंत्रण प्रदान करता है।


1
अजगर 3.3 का उपयोग करना:LookupError: unknown encoding: hex
जेनस ट्रॉल्सन

@JanusTroelsen: 'hex_codec' आज़माएँ । या binascii.hexlify(b'foo')सीधे उपयोग करें
8

7
import codecs
codecs.getencoder('hex_codec')(b'foo')[0]

पायथन 3.3 में काम करता है (इसलिए "हेक्स" के बजाय "hex_codec")।


शायद दिलचस्प है, पायथन 3.4 में "हेक्स" या "हेक्स_कोड" ठीक काम करता है।
स्टीफन पॉलगर

6

विधि ascii हेक्स स्ट्रिंग का प्रतिनिधित्व करने binascii.hexlify()के bytesलिए परिवर्तित हो जाएगा bytes। इसका मतलब है कि इनपुट में प्रत्येक बाइट दो अस्सी वर्णों में परिवर्तित हो जाएगी। यदि आप एक सच strबाहर चाहते हैं तो आप .decode("ascii")परिणाम कर सकते हैं ।

मैंने एक स्निपेट शामिल किया जो इसे दिखाता है।

import binascii

with open("addressbook.bin", "rb") as f: # or any binary file like '/bin/ls'
    in_bytes = f.read()
    print(in_bytes) # b'\n\x16\n\x04'
    hex_bytes = binascii.hexlify(in_bytes) 
    print(hex_bytes) # b'0a160a04' which is twice as long as in_bytes
    hex_str = hex_bytes.decode("ascii")
    print(hex_str) # 0a160a04

हेक्स स्ट्रिंग से "0a160a04"करने के लिए वापस आ सकते हैं करने के लिए bytesके साथ binascii.unhexlify("0a160a04")जो वापस देता हैb'\n\x16\n\x04'


3

ठीक है, यदि आप केवल पायथन 3 के बारे में परवाह करते हैं, तो निम्नलिखित उत्तर थोड़ा परे है, लेकिन यह प्रश्न पहला Google हिट है, भले ही आप पायथन संस्करण को निर्दिष्ट नहीं करते हैं, इसलिए यहां एक तरीका है जो पायथन 2 और पायथन 3 दोनों पर काम करता है ।

मैं बाइट्स को इस strप्रकार में बदलने के बारे में प्रश्न की व्याख्या कर रहा हूं: अर्थात् , पायथन 2 पर बाइट्स-वाई, और पायथन 3 पर यूनिकोड-वाई।

यह देखते हुए, मुझे पता है कि सबसे अच्छा तरीका है:

import six

bytes_to_hex_str = lambda b: ' '.join('%02x' % i for i in six.iterbytes(b))

निम्नलिखित कथन Python 2 या Python 3 के लिए सही होंगे, यह मानते हुए कि आपने unicode_literalsPython 2 में भविष्य को सक्रिय नहीं किया है :

assert bytes_to_hex_str(b'jkl') == '6a 6b 6c'

(या आप ''.join()बाइट्स, आदि के बीच की जगह को छोड़ने के लिए उपयोग कर सकते हैं )


3

इसका उपयोग उस प्रारूप को निर्दिष्ट करने %x02और उस हेक्स मान को आउटपुट करने के लिए किया जा सकता है । उदाहरण के लिए:

>>> foo = b"tC\xfc}\x05i\x8d\x86\x05\xa5\xb4\xd3]Vd\x9cZ\x92~'6"
>>> res = ""
>>> for b in foo:
...     res += "%02x" % b
... 
>>> print(res)
7443fc7d05698d8605a5b4d35d56649c5a927e2736

मेरे अनुसार, यह सबसे अच्छा जवाब है क्योंकि यह हर पायथन संस्करण के साथ काम करता है और इसे किसी भी आयात की आवश्यकता नहीं है। फिर भी, मैं ऊपरी मामले में हेक्सा स्ट्रिंग्स को बेहतर प्रदर्शित करूंगाres.upper()
ब्रूको एल।


0

यदि आप b '\ x61' को 97 या '0x61' में बदलना चाहते हैं, तो आप यह कोशिश कर सकते हैं:

[python3.5]
>>>from struct import *
>>>temp=unpack('B',b'\x61')[0] ## convert bytes to unsigned int
97
>>>hex(temp) ##convert int to string which is hexadecimal expression
'0x61'

संदर्भ: https://docs.python.org/3.5/library/struct.html


किसी तरह मेरी मदद करता है esp32
तेजस टैंक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.