PDA

View Full Version : [C] Estrarre intero a 2byte da un array di bytes (stream TCP)


zissex
06-08-2008, 11:03
Ciao a tutti,ho un'applicazione che mi manda un messaggio cosi composto (vi indico all'interno dell'array le posizioni occupate da ogni dato) tramite stream TCP:

msg[0]: un char (che non mi interessa)

msg[1-4]: un int che vorrei stampare

msg[5-6]: uno short int che vorrei stampare

Per ora riesco sempre e solo a stampare la prima posizione di questi dati, percio' per puro caso l'int in posizione 1-4 (essendo in littleendian)
mi viene stampato correttamente (e' infatti un intero <9).

Come faccio a far capire al programma che il dato che voglio stampare occupa piu' di una posizione nell'array?

Non sara' mica necessario copiare byte per byte ogni dato in un array apposito? Spero di no..

grazie in anticipo

zissex
06-08-2008, 13:55
Salve,

uint16_t res;
uint8_t tmp, tmp2;
tmp=65;
tmp2=31;
res = res | tmp2;
res = res >> 8;
res = res | tmp;
printf (" res = %d \n", res);

sono riuscito a risolvere il problema di mettere in un unica variabile a 16 bit il contenuto di due posizioni del mio array, ora pero' non riesco a stampare la mia variabile a 16 bit, me ne stampa solo 8.
La printf() mi stampa il valore 65 (cioe' tmp), quando io vorrei che stampasse tutti e 16 i bit (cioe' il valore 8001).

Non riesco a capire dove sbaglio, qualcuno sa indicarmi il problema ?

Grazie in anticipo.

gugoXX
06-08-2008, 21:35
Cosi' puo' andare?


char msg[50];
...
char* p_primochar=(char*)msg;
char primochar=*p_primochar;
int* p_primoval = (int*)(msg+1);
int primoval=*p_primoval;
int* p_secondoval = (int*)(msg+5);
int secondoval=*p_secondoval;
printf("%d %d",primoval,secondoval);


Dove il +1 e il +5 sono basati rispettivamente su una lunghezza 1 del char (che dovrebbe essere sempre cosi'), e una lunghezza 4 dell'int (e talvolta non e' cosi').
Se vuoi usare il C o il C++ ti consiglio di studiare bene i puntatori.

DanieleC88
06-08-2008, 23:15
Vedo che gugoXX ha già spiegato bene come prendere due byte alla volta con un utilizzo sapiente dei puntatori, invece per rigenerare una word partendo da due byte puoi fare in modo simile:
uint8_t lo = 0x34;
uint8_t hi = 0x12;
uint16_t word;

word = (lo | hi << 8);
Era semplicemente sbagliato lo shift nel tuo codice precedente.

ciao ;)