Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Bit, bytes e complemento di due in Python

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

0
voti

[1] Bit, bytes e complemento di due in Python

Messaggioda Foto Utenteboiler » 10 giu 2014, 8:34

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
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5618
Iscritto il: 9 nov 2011, 12:27

2
voti

[2] Re: Bit, bytes e complemento di due in Python

Messaggioda Foto UtentePaolino » 10 giu 2014, 9:13

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.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[3] Re: Bit, bytes e complemento di due in Python

Messaggioda Foto Utenteboiler » 10 giu 2014, 9:39

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
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5618
Iscritto il: 9 nov 2011, 12:27

3
voti

[4] Re: Bit, bytes e complemento di due in Python

Messaggioda Foto UtentePaolino » 10 giu 2014, 10:08

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.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)


Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 20 ospiti