PDA

Visualizza la versione completa : [C]mettere int in vettore unsigned char come hex


honneamise
27-12-2004, 13:12
sto scrivendo una applicazione client-server.
le comunicazioni tra i due avvengono inviando "messaggi" composti da un vettore di unsigned char che vengono tutti interpretati o come serie di caratteri ( se vine inviato/ricevuto una stringa) oppure come dei valori interi,ma
ho questo problema :

-----------------
int intero=3106;

unsigned char caratteri[20];

caratteri[5]=intero;
-----------------

che come capite NON funziona,perche'

(dec)3106 = (hex)C22

e ovviamente C22 NON ci sta in un solo unsigned char

dovrei fare :
caratteri[5]=0x0C
caratteri[6]=0x22

inoltre dato che devo inviare questi dati via tcp mi vedo costretto a doverli invertirli quindi :

caratteri[5]=0x22
caratteri[6]=0x0C


avete suggerimenti per risolvere questo problema ?

unomichisiada
28-12-2004, 13:21
Originariamente inviato da honneamise
sto scrivendo una applicazione client-server.
le comunicazioni tra i due avvengono inviando "messaggi" composti da un vettore di unsigned char che vengono tutti interpretati o come serie di caratteri ( se vine inviato/ricevuto una stringa) oppure come dei valori interi,ma
ho questo problema :

-----------------
int intero=3106;

unsigned char caratteri[20];

caratteri[5]=intero;
-----------------

che come capite NON funziona,perche'

(dec)3106 = (hex)C22

e ovviamente C22 NON ci sta in un solo unsigned char

dovrei fare :
caratteri[5]=0x0C
caratteri[6]=0x22

inoltre dato che devo inviare questi dati via tcp mi vedo costretto a doverli invertirli quindi :

caratteri[5]=0x22
caratteri[6]=0x0C


avete suggerimenti per risolvere questo problema ?
Non ho capito bene lo scenario,spiega meglio cosa devi fare per favore

honneamise
28-12-2004, 13:44
dunque ho un vettore di unsigned char :

unsigned char messaggio[20];

questo vettore lo "riempio" per esempio con dei caratteri:

messaggio[0]='c';
messaggio[1]='i';
messaggio[2]='a';
messaggio[3]='o';

oppure con dei valori in esadecimale (hex):

messaggio[4]=0x01;
messaggio[5]=0x02;
messaggio[6]=0xAA;

ora vorrei mettere in messaggio[7] il valore intero in base 10 3106 :

int intero = 3106;//OK

messaggio[7]=intero; //QUESTA COSA NON FUNZIONA !!!

ed e' giusto che non funzioni, perche' il valore massimo che posso mettere in un unsigned char e' 0xFF , cioe' 255 .

3106 in esadecimale e' : C22

in pratica devo utilizzare sia messaggio[7] sia messaggio[8],cioe':

messaggio[7]=0x0C;
messaggio[8]=0x22;

unomichisiada
29-12-2004, 01:48
Originariamente inviato da honneamise
dunque ho un vettore di unsigned char :

unsigned char messaggio[20];

questo vettore lo "riempio" per esempio con dei caratteri:

messaggio[0]='c';
messaggio[1]='i';
messaggio[2]='a';
messaggio[3]='o';

oppure con dei valori in esadecimale (hex):

messaggio[4]=0x01;
messaggio[5]=0x02;
messaggio[6]=0xAA;

ora vorrei mettere in messaggio[7] il valore intero in base 10 3106 :

int intero = 3106;//OK

messaggio[7]=intero; //QUESTA COSA NON FUNZIONA !!!

ed e' giusto che non funzioni, perche' il valore massimo che posso mettere in un unsigned char e' 0xFF , cioe' 255 .

3106 in esadecimale e' : C22

in pratica devo utilizzare sia messaggio[7] sia messaggio[8],cioe':

messaggio[7]=0x0C;
messaggio[8]=0x22;
Si certo,in un solo carattere (1byte) non c'è modo di farci stare un intero (due byte,o anche di più in alcuni casi)quindi devi per forza utilizzare più posizioni del vettore esattamente come hai detto tu stesso,è per questo che non capisco dove sta il tuo problema.Nella distinzione tra un intero ed il successivo?Metti un carattere speciale di separazione...oppure qual'è?

honneamise
31-12-2004, 15:28
allora via "cast" nulla da fare a parte un warning su gcc ( visual manco se ne accorge ...)

la soluzione "parziale e incompleta " che ho trovato e' usare lo shift come segue :

packet_info[19]=(unsigned char)1233;
packet_info[20]=(unsigned char)1233>>8;

dovrei trovare ora una funzione che mi dica
34 e' grosso 1 byte;
1233 e' grosso 2 byte;

K e' grosso N byte

poi faccio un for del tipo:

// X e' la posizione del vattore da cui partire a scrivere il valore intero
for (i=0;i<N;i++)
{
vettore[ i + x]= valore_intero >> ( 8 * i ) ;
}

che ne dite ?

pprllo
31-12-2004, 19:28
Allora la funzione che ti dice quanti byte ...


int size(int number)
{
int s;
for(s = 1; n > 256; n/=256, s++);
return s;
}

Solo mi chiedo, come farà il tuo prog a sapere quanti caratteri deve leggere ? Siccome un integer sta in 4 byte esatti, forse ti conviene limitarti a dividerlo in 4 parti di 1 byte ...

i'mshady
02-01-2005, 15:45
Originariamente inviato da honneamise
sto scrivendo una applicazione client-server.
le comunicazioni tra i due avvengono inviando "messaggi" composti da un vettore di unsigned char che vengono tutti interpretati o come serie di caratteri ( se vine inviato/ricevuto una stringa) oppure come dei valori interi,ma
ho questo problema :

-----------------
int intero=3106;

unsigned char caratteri[20];

caratteri[5]=intero;
-----------------

che come capite NON funziona,perche'

(dec)3106 = (hex)C22

e ovviamente C22 NON ci sta in un solo unsigned char

dovrei fare :
caratteri[5]=0x0C
caratteri[6]=0x22

inoltre dato che devo inviare questi dati via tcp mi vedo costretto a doverli invertirli quindi :

caratteri[5]=0x22
caratteri[6]=0x0C


avete suggerimenti per risolvere questo problema ?

prova così..



caratteri [5] = intero % 256 //0x22
caratteri [6] = intero / 256 //0x0C


:ciauz:

Loading