अजगर में बाइट सरणी के लिए हेक्साडेसिमल स्ट्रिंग


150

मेरे पास एक लंबा हेक्स स्ट्रिंग है जो विभिन्न प्रकारों के मूल्यों की एक श्रृंखला का प्रतिनिधित्व करता है। मैं इस हेक्स स्ट्रिंग को एक बाइट सरणी में बदलना चाहता हूं ताकि मैं प्रत्येक मूल्य को बाहर स्थानांतरित कर सकूं और इसे अपने उचित डेटा प्रकार में परिवर्तित कर सकूं।


कैसे हेक्स स्ट्रिंग की तरह दिखता है?
खटिक

जवाबों:


239

मान लीजिए कि आपका हेक्स स्ट्रिंग कुछ ऐसा है

>>> hex_string = "deadbeef"

इसे एक स्ट्रिंग में परिवर्तित करें (पायथन to 2.7):

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

या पायथन 2.7 और पायथन 3.0 के बाद से:

>>> 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ऑब्जेक्ट की तलाश है, तो यह `बाइट्स.फ्रॉमहेक्स (" 00010203040506070809090A0B0C0D0E0F ") है, जो पैदावार देता है b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'। प्रश्न के जवाब के रूप में पोस्टिंग नहीं बाइट सरणी के लिए, लेकिन यहाँ पोस्टिंग क्योंकि यह पहली हिट है जब मुझे बाइट्स के लिए हेक्स की खोज करते समय मिला।
मैट्रिक्सनोमल जूल

@ हूब्रो दरअसल, hex_string.decode("hex")पायथन 2.7 पर काम कर रहा है। मैंने सिर्फ अपने पर परीक्षण किया Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
मेवएक्स

@ मेवएक्स मैंने पायथन 3 कहा, पायथन 2.7 नहीं
हुब्रो

3
ध्यान दें कि bytes.fromhexइनपुट स्ट्रिंग में वर्णों की विषम संख्या होने पर त्रुटि होती है: bytes.fromhex("aab")ValueError: non-hexadecimal number found in fromhex() arg at position 3
Константин Ван

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

B एक बाइट (8 बिट) के बराबर है

H दो बाइट्स (16 बिट) के बराबर है

अधिक उपलब्ध वर्ण और बाइट आकार यहां देखे जा सकते हैं

फायदे हैं ..

आप एक से अधिक बाइट और मानों के अंत को निर्दिष्ट कर सकते हैं

नुकसान ..

आपको वास्तव में अपने व्यवहार के प्रकार और लंबाई को जानना होगा


2
नुकसान: यह एक बाइट स्ट्रिंग है, न कि हेक्स स्ट्रिंग, इसलिए यह प्रश्न का उत्तर नहीं है।
qris

यह सवाल के 2 भाग का जवाब है "... ताकि मैं प्रत्येक मूल्य को बाहर स्थानांतरित कर सकूं और इसे उसके उचित डेटा प्रकार में परिवर्तित कर सकूं"।
रेनल्ड 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)

यह स्ट्रिंग में प्रत्येक चार पर पुनरावृति करेगा और इसे ऑर्ड () फ़ंक्शन के माध्यम से चलाएगा। केवल अजगर 2.6 पर परीक्षण किया गया, 3.0+ के बारे में भी निश्चित नहीं है।

-जोश


उत्तम। अजगर 2.7 पर काम कर रहे हैं
रिचर्ड

यदि यह सही है तो इस उत्तर के आगे चेकमार्क की रूपरेखा पर क्लिक करें! :)
जथनवाद

1
यह हेक्स को परिवर्तित नहीं करता है - यह स्ट्रिंग के प्रत्येक वर्ण को पूर्णांक में परिवर्तित करता है। हेक्स के लिए प्रत्येक जोड़ी वर्ण एक बाइट का प्रतिनिधित्व करेगा। आप शायद कह सकते हैंbyte_list = bytearray(hex_string)
स्कॉट ग्रिफ़िथ्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.