2012-01-11 21 views
12

में बिट्स को बाइट्स में कनवर्ट करें मैं Python3.2 के साथ काम कर रहा हूं। मुझे इनपुट के रूप में एक हेक्स स्ट्रीम लेने और बिट-स्तर पर इसे पार्स करने की आवश्यकता है। इसलिए मैंपाइथन

bytes.fromhex(input_str)

इस्तेमाल किया वास्तविक बाइट्स स्ट्रिंग कन्वर्ट करने के लिए। अब मैं इन बाइट्स को बिट्स में कैसे परिवर्तित करूं?

+1

बाइट बिट्स हैं, केवल एक समय में 8;) - उत्तर उस पर निर्भर करता है कि आप क्या करना चाहते हैं, कृपया अधिक विशिष्ट रहें, इसके अलावा बिट-मैनिपुलेशन अधिकतर बाइट स्तर पर किया जाता है ... –

+0

मैं बाइट्स का प्रतिनिधित्व करना चाहता हूं फॉर्म थोड़ा स्ट्रिंग है ताकि मैं कुछ ऐसा कर सकूं: फ़ील्ड 1 = बिट_स्ट्रिंग [0: 1] फ़ील्ड 2 = बिट_स्ट्रिंग [1:16] और – user904832

उत्तर

10

इस तरह कुछ के बारे में क्या?

>>> bin(int('ff', base=16)) 
'0b11111111' 

यह हेक्साडेसिमल स्ट्रिंग आप एक पूर्णांक के लिए है और एक स्ट्रिंग है जिसमें प्रत्येक बाइट पूर्णांक बिट मूल्य के आधार पर 0/1 के लिए निर्धारित है कि पूर्णांक परिवर्तित कर देंगे।

के रूप में एक टिप्पणी से कहा, तुम 0b उपसर्ग से छुटकारा पाने की जरूरत है, तो आप इसे इस तरह से कर सकते हैं:

>>> bin(int('ff', base=16)).lstrip('0b') 
11111111 

या इस तरह से:

>>> bin(int('ff', base=16))[2:] 
11111111 
+0

lstrip ('- 0b') # प्रमुख शून्य और शून्य चिह्न को हटाएं – ahoffer

+0

@ahoffer आपकी टिप्पणी के लिए धन्यवाद। मैंने ओपी को यह जानने के लिए अपना जवाब अपडेट कर दिया है कि '0 बी' उपसर्ग को कैसे हटाया जाए। – jcollado

+4

ध्यान दें कि 'lstrip '' 'stb' 'को हटाने के लिए अक्षरों के एक * सेट * के बाद से' 00bb' ',' 00bb' 'को भी हटा दिया जाएगा। यह इस मामले में ठीक काम करेगा, लेकिन मैं '[2:] 'समाधान पसंद करता हूं क्योंकि यह अधिक स्पष्ट है। –

14

संचालन ज्यादा हैं जब आप पूर्णांक स्तर पर काम करते हैं तो तेज़ी से। विशेष रूप से, यहां सुझाए गए स्ट्रिंग में कनवर्ट करना वास्तव में धीमा है।

यदि आप केवल बिट 7 और 8 चाहते हैं, तो उदाहरण का उपयोग करें।

val = (byte >> 6) & 3 

(यह है:। सही करने के लिए बाइट 6 बिट शिफ्ट - उन्हें छोड़ने तब ही पिछले दो बिट्स रखने 3 पहले दो बिट्स सेट के साथ नंबर है ...)

इन कर सकते हैं आसानी से सरल सीपीयू ऑपरेशंस में अनुवाद किया जा सकता है जो सुपर फास्ट हैं।

23

यह करने के लिए एक और तरीका है bitstring मॉड्यूल का उपयोग करना है:

>>> from bitstring import BitArray 
>>> input_str = '0xff' 
>>> c = BitArray(hex=input_str) 
>>> c.bin 
'0b11111111' 

और तुम पट्टी की जरूरत है प्रमुख 0b:

>>> c.bin[2:] 
'11111111' 

bitstring मॉड्यूल नहीं एक आवश्यकता के रूप में है jcollado का उत्तर दिखाता है, लेकिन इसमें बिट्स में इनपुट बदलने और उन्हें छेड़छाड़ करने के लिए बहुत से प्रदर्शन विधियां हैं।

>>> c.uint 
255 
>>> c.invert() 
>>> c.bin[2:] 
'00000000' 

आदि

+1

+1। और बिटस्ट्रिंग (3.0) के नवीनतम संस्करण के लिए आपको अग्रणी '0 बी' को पट्टी करने की आवश्यकता नहीं है। –

4

द्विआधारी करने के लिए:: आप इस काम (या नहीं), उदाहरण के लिए मिल सकती है

bin(byte)[2:].zfill(8) 
+0

आप बिन का उपयोग कर एक बाइट परिवर्तित नहीं कर सकते हैं। – user3467349

3

मुझे लगता है कि सबसे सरल उपयोग numpy यहाँ होगा।उदाहरण के लिए आप बाइट्स के रूप में एक फ़ाइल को पढ़ सकता है और उसके बाद इस तरह आसानी से बिट्स के लिए यह विस्तार:

Bytes = numpy.fromfile(filename, dtype = "uint8") 
Bits = numpy.unpackbits(Bytes) 
1

उपयोग ord जब पढ़ने बाइट्स पढ़ने:

byte_binary = bin(ord(f.read(1))) # Add [2:] to remove the "0b" prefix 

या

str.format() का उपयोग करना:

'{:08b}'.format(ord(f.read(1))) 
0

यहां कैसे format()

print "bin_signedDate : ", ''.join(format(x, '08b') for x in bytevector) 

का उपयोग कर यह महत्वपूर्ण 08B है यह करने के लिए। इसका मतलब यह है कि यह बाइट को पूरा करने के लिए अधिकतम 8 अग्रणी शून्यों को जोड़ा जाएगा। यदि आप इसे निर्दिष्ट नहीं करते हैं तो प्रारूप में प्रत्येक रूपांतरित बाइट के लिए एक परिवर्तनीय बिट लंबाई होगी।

0

अन्य उत्तर यहाँ big-endian आदेश ('\x01''00000001' हो जाता है)

मामले में आप बिट्स के छोटे-endian आदेश है, जो कई मामलों में उपयोगी है, के आम अभ्यावेदन की तरह में रुचि रखते हैं में बिट्स प्रदान करते हैं - bignums आदि है कि यहाँ के लिए एक टुकड़ा है:

def bits_little_endian_from_bytes(s): 
    return ''.join(bin(ord(x))[2:].rjust(8,'0')[::-1] for x in s) 

और दूसरी दिशा के लिए:

def bytes_from_bits_little_endian(s): 
    return ''.join(chr(int(s[i:i+8][::-1], 2)) for i in range(0, len(s), 8))