Pagina 1 di 1

Bit, bytes e complemento di due in Python

MessaggioInviato: 10 giu 2014, 8:34
da boiler
Ciao a tutti

Prima che lo schermo voli dalla finestra e io debba spiegare in modo imbarazzante a quelli dell'IT perché me ne serve uno nuovo, vi sarei grato se qualcuno potesse darmi un'idea su come risolvere questo problema.

Con uno script in Python (non ho scelto io di usare questo aborto di linguaggio di pseudo-programmazione) leggo da un'interfaccia SPI tre bytes:

Codice: Seleziona tutto
MSB = ord(spi.bulk_trans(1, [0xFF]))
MB = ord(spi.bulk_trans(1, [0xFF]))
LSB = ord(spi.bulk_trans(1, [0xFF]))


Si tratta del risultato della conversione di un ADC. Sono 24 bit in formato "2's complement".
E qui parte l'odissea del cercare di convertire questi tre valori in un integer utilizzabile.

Ho provato così:
Codice: Seleziona tutto
code = LSB + MB*256 + (MSB & 0x7F)*256*256 - 0x800000 * (MSB & 0x80)

Non funziona.

Ho provato così:
Codice: Seleziona tutto
code = LSB + MB*256 + MSB*256*256
if (code & 0x800000) > 0:
            code = -(~(code & 0x7FFFFF) + 0b1)

Non funziona.

Idee (oltre ad usare C++)?

Boiler

Re: Bit, bytes e complemento di due in Python

MessaggioInviato: 10 giu 2014, 9:13
da Paolino
Sono un po' arrugginio con Python, ma prova così:
Codice: Seleziona tutto
code = ~(LSB + MSB*256 + MB * 256 * 256) +1

In questo modo ottieni il valore assoluto del dato.

Poi, ti basta controllare che il bit più alto di MB sia alto per determinare se il valore è negativo:

Codice: Seleziona tutto
if ((MB & 0x80) = 1):
                    code = -code


A parte qualche errore di indentazione e (forse) di sintassi, dovresti riuscire.

Ciao.

Paolo.

Re: Bit, bytes e complemento di due in Python

MessaggioInviato: 10 giu 2014, 9:39
da boiler
Ciao Foto UtentePaolino e grazie per la risposta

Codice: Seleziona tutto
if ((MB & 0x80) = 1):
                    code = -code


MSB, suppongo :cool:

Non funziona nemmeno così, ma ho trovato la soluzione.
A quanto pare ha a che fare con il modo in cui python rappresenta i numeri in memoria: non hanno lunghezza definita, ma hanno un padding a sinistra virtualmente infinito (viene espanso a piacere a dipendenza dell'operazione che si fa). E per i numeri negativi questo padding è 1.
Che linguaggio di incz incz incz

Per ottenere quello che voglio bisogna prima installare e poi importare il modulo bitstring e poi fare quanto segue.

Codice: Seleziona tutto
codebit = BitArray(hex(LSB + MB*256 + MSB*256*256))
code = codebit.int


Saluti Boiler

Re: Bit, bytes e complemento di due in Python

MessaggioInviato: 10 giu 2014, 10:08
da Paolino
boiler ha scritto:MSB, suppongo :cool:

Sì, perdona il refuso.

boiler ha scritto:Per ottenere quello che voglio bisogna prima installare e poi importare il modulo bitstring e poi fare quanto segue.

Beh, dai: forse questo è il male minore :D

Ciao.

Paolo.