2012-07-26 11 views
6

Descrizione del campo binario è:Python, come decodificare binario decimale codificato (BCD)

numero del chiamante, espressa con codice BCD compressa, ed i bit in eccesso vengono riempiti con “0xF”

Ho provato a stampare con il formato struct '16c' e ottengo: ('3', '\x00', '\x02', '\x05', '\x15', '\x13', 'G', 'O', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff') e se uso '16b' ottengo (51, 0, 2, 5, 21, 19, 71, 79, -1, -1, -1, -1, -1, -1, -1, -1). E non è corretto, dovrei ottenere il numero di telefono, e i numeri sopra non sono validi.

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

Sopra è il codice che non ha funzionato e ottengo numeri non validi. Con quale formato dovrei decomprimere quel campo da 16 byte e come convertire il codice BCD?

risposta

11

I codici BCD funzionano con 4 bit per numero e normalmente codificano solo le cifre da 0 a 9. Quindi ogni byte della sequenza contiene 2 numeri, 1 per 4 bit di informazioni.

Il seguente metodo utilizza un generatore per produrre tali cifre; Io parto dal presupposto che un valore 0xF significa che non ci sono più cifre da seguire:

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

Qui ho utilizzare un right-shift operator per spostare più a sinistra 4 bit a destra, e un bitwise AND per selezionare solo il più a destra 4 bit.

Dimostrazione:

>>> 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] 

Il metodo funziona con la c uscita; è possibile saltare la chiamata ord nel metodo se si passano gli interi direttamente (ma utilizzare invece la variante senza segno B). In alternativa, puoi semplicemente leggere quei 16 byte direttamente dal tuo file e applicare questa funzione direttamente a quei byte senza usare struct.

+0

Grazie mille. – Whit3H0rse

+0

+1 Molto elegante e pitonico! – Kos

Problemi correlati