|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Sep 2008
Messaggi: 1
|
[C] Estrazione del byte più significativo da dati ricevuti da un apparecchio
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 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
l'operazione corretta per quello che vuoi fare è lo "shift"
se: Codice:
int16U rssi; int8U rss1 = (rssi >> 8) & 0xFF
__________________
ho concluso con: kvegeta, doctordb, Leland Gaunt.
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Aug 2005
Messaggi: 168
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
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: Codice:
int16_t word = /* valore originario */; int8_t *ptr = (int8_t *) &word; return ptr[0]; /* l'indice dipende dall'endianness */
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#5 |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 21857
|
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)
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
No, non lo e'. In automatico c'e' l'estensione del segno, quindi per sicurezza vizzz ha messo l'AND
__________________
In God we trust; all others bring data |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Aug 2005
Messaggi: 168
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Mar 2000
Città: Bari-Brindisi-Lecce e prov
Messaggi: 424
|
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.
__________________
VoIp Gratis - Adsl senza canone telecom Ho trattato con: adarkar,Bobosassa, matrix866,M@t,k|o, percky,s5otto, Rospaccio, CluRaCaN, Igor,Zizziry, bokkakesballa, Pex,freewilly, Umbyboy,DAVO, nathbigga, fabiuxx ed altri. Diffidate di quinnuxxa |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
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.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#10 |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 21857
|
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
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
E pero' hanno ragione a dire che non e' portabile.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:37.











ho concluso con: kvegeta, doctordb, Leland Gaunt.









