2012-07-26 48 views
6

द्विआधारी क्षेत्र का विवरण डिकोड करने के लिए कैसे:अजगर, द्विआधारी कोडित दशमलव (बीसीडी)

कोलर संख्या, संकुचित बीसीडी कोड के साथ व्यक्त किया और अधिशेष बिट्स "0xF"

से भर रहे हैं

मैंने संरचना प्रारूप '16c' के साथ प्रिंट करने का प्रयास किया है और मुझे लगता है: ('3', '\x00', '\x02', '\x05', '\x15', '\x13', 'G', 'O', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff') और यदि मैं '16b' का उपयोग करता हूं तो मुझे (51, 0, 2, 5, 21, 19, 71, 79, -1, -1, -1, -1, -1, -1, -1, -1) मिलता है। और यह सही नहीं है, मुझे फोन नंबर मिलना चाहिए, और उपरोक्त संख्याएं अमान्य हैं।

print struct.unpack_from('>16b', str(data.read()),offset=46) 

ऊपर कोड है जो काम नहीं करता है और मुझे अमान्य संख्या मिलती है। मुझे किस प्रारूप के साथ 16 बाइट फ़ील्ड को अनपैक करना चाहिए और बीसीडी कोड को कैसे परिवर्तित करना चाहिए?

उत्तर

11

बीसीडी कोड प्रति बिट 4 बिट्स के साथ काम करते हैं, और आम तौर पर केवल अंक 0 - 9 को एन्कोड करते हैं। इसलिए आपके अनुक्रम में प्रत्येक बाइट में 2 संख्याएं, 1 बिट्स की जानकारी होती है।

निम्न विधियां उन अंकों को उत्पन्न करने के लिए जनरेटर का उपयोग करती हैं; मैं यह सोचते हैं रहा हूँ एक 0xF मूल्य का मतलब है कि कोई और अधिक अंक पालन करने के लिए देखते हैं:

def bcdDigits(chars): 
    for char in chars: 
     char = ord(char) 
     for val in (char >> 4, char & 0xF): 
      if val == 0xF: 
       return 
      yield val 

यहाँ मैं एक right-shift operator का उपयोग सही करने के लिए सबसे बाईं ओर 4 बिट्स स्थानांतरित करने के लिए, और एक bitwise AND चयन करने के लिए सिर्फ सही-सबसे 4 बिट्स

प्रदर्शन:

>>> characters = ('3', '\x00', '\x02', '\x05', '\x15', '\x13', 'G', 'O', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff') 
>>> list(bcdDigits(characters)) 
[3, 3, 0, 0, 0, 2, 0, 5, 1, 5, 1, 3, 4, 7, 4] 

विधि c उत्पादन के साथ काम करता है; यदि आप सीधे पूर्णांक पास करते हैं तो आप विधि में ord कॉल को छोड़ सकते हैं (लेकिन B इसके बजाय हस्ताक्षरित संस्करण का उपयोग करें)। वैकल्पिक रूप से, आप केवल अपनी फ़ाइल से उन 16 बाइट्स को पढ़ सकते हैं और इस फ़ंक्शन को सीधे उन बाइट्स पर लागू कर सकते हैं जो संरचना का उपयोग किए बिना सीधे हैं।

+0

आपको बहुत बहुत धन्यवाद। – Whit3H0rse

+0

+1 बहुत सुरुचिपूर्ण और अजगर! – Kos