PDA

View Full Version : [C] Estrazione del byte più significativo da dati ricevuti da un apparecchio


Francuz84
18-12-2008, 17:23
Ciao a tutti ragazzi sto imparando ad usare il C man mano che vado avanti con un corso in università. Ho realizzato un programma in C che permmette ad un PC host di interfacciarsi con uno strumento, pilotarlo ed estrarre i dati di mio interesse.

Riguardo un dato da estrarre, ho bisogno di prelevare il byte più significativo da una word di 16 bit.

Il dato che ricevo dallo strumento è un INT16U di nome rssi;
il byte più significativo che estraggo è di tipo int a cui ho assegnato il nome rssi1;
per ottenere l'informazione di cui ho bisogno eseguo la seguente operazione:

rssi1 = rssi/256;

credete che sia un operazione valida? In caso contrario come mi consigliate di procedere?

Grazie per l'attenzione
Francesco

vizzz
18-12-2008, 17:28
l'operazione corretta per quello che vuoi fare è lo "shift"
se:
int16U rssi;
int8U rss1 = (rssi >> 8) & 0xFF

Kenger
18-12-2008, 22:33
l'operazione corretta per quello che vuoi fare è lo "shift"
se:
int16U rssi;
int8U rss1 = (rssi >> 8) & 0xFF

Non ho capito perchè fai un AND tra un valore a 16 bit e 8 1.
Il padding dello shift non è a 0 in automatico? :confused:

DanieleC88
19-12-2008, 04:08
In realtà in quel caso non credo serva nemmeno più l'and, ma, ad ogni modo, dipende dalla tua CPU (è big endian o little endian?); può bastarti un and o essere necessario lo shift, te la dovresti comunque cavare con poco.

Alternativamente puoi ricorrere ad una soluzione di questo tipo:
int16_t word = /* valore originario */;
int8_t *ptr = (int8_t *) &word;

return ptr[0]; /* l'indice dipende dall'endianness */

ciao ;)

!fazz
19-12-2008, 09:21
se la tua word a 16 bit è un valore intero io andrei di cast esplicito a tipo carattere (8 bit) se la cella contenente l'msb è la prima delle 2 sei apposto altrimenti un +1 ad un puntatore a carattere.


(almeno così mi pare che dovrebbe funzionare il c nn lo uso da parecchio)

sottovento
19-12-2008, 13:42
Non ho capito perchè fai un AND tra un valore a 16 bit e 8 1.
Il padding dello shift non è a 0 in automatico? :confused:

No, non lo e'. In automatico c'e' l'estensione del segno, quindi per sicurezza vizzz ha messo l'AND

Kenger
19-12-2008, 15:43
No, non lo e'. In automatico c'e' l'estensione del segno, quindi per sicurezza vizzz ha messo l'AND

Ah, OK. Grazie :)

stefano_ba
19-12-2008, 21:18
In questi casi il metodo generale e' quello di fare un and tra il dato ed una maschera composta da 1 nei bit che mi interessano e 0 nelle altre posizioni.
Successivamente si effettuano degli shift per spostare i bit nelle posizioni che interessano.

gugoXX
19-12-2008, 22:37
Anche senza AND sarebbe funzionato allo stesso modo.
Dentro un byte piu' di 8 bit non si possono fare entrare, e con o senza AND sarebbero entrati gli stessi.
Avrei esplicitato il cast, anche se non necessario.

!fazz
20-12-2008, 11:24
Anche senza AND sarebbe funzionato allo stesso modo.
Dentro un byte piu' di 8 bit non si possono fare entrare, e con o senza AND sarebbero entrati gli stessi.
Avrei esplicitato il cast, anche se non necessario.

io avrei sfruttato direttamente come detto sopra il non essere typesafe del c per prendere subito gli 8 bit necessari senza and e senza shift soluzione un pò brutale, anche poco chiara da leggere, ma efficace

gugoXX
20-12-2008, 17:15
io avrei sfruttato direttamente come detto sopra il non essere typesafe del c per prendere subito gli 8 bit necessari senza and e senza shift soluzione un pò brutale, anche poco chiara da leggere, ma efficace

E pero' hanno ragione a dire che non e' portabile.