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
l'operazione corretta per quello che vuoi fare è lo "shift"
se:
int16U rssi;
int8U rss1 = (rssi >> 8) & 0xFF
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 ;)
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
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.
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.
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
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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.