View Single Post
Old 28-12-2004, 14:09   #4
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Quote:
Originariamente inviato da honny
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;
In realta' il numero di caratteri necessari possono essere ben piu' di due (tipicamente 4 in una generica macchina a 32 bit).
La cosa piu' semplice e' fare un cast dell'array ad un array di interi e poi scriverci direttamente. Se pero' devi mandare il messaggio su architetture differenti, ti conviene convertire il valore in un formato neutrale, e fissare il numero di bit che vuoi usare
Ad esempio, se ti bastano gli interi senza segno puoi fare qualcosa del genere (notazione C++, per il C ci potrebbero essere delle differenze minori):
Codice:
#include <netinet/in.h>

...

uint32_t* x = (uint32_t*) messaggio;
x[0]=htonl(3106); // questo va a scrivere da messaggio[0] a messaggio[3]
Quando devi rileggere il valore dall'array fai la stessa cosa, convertendo pero' l'intero da "formato network" a quello specifico della macchina in uso:
Codice:
#include <netinet/in.h>

...

uint32_t* x = (uint32_t*) messaggio;
uint32_t n = ntohl( x[0] );
Se non ti servono tutti e 32 i bit, ma te ne bastano 16, allora puoi usare uint16_t, htons e ntohs.

DISCLAIMER: codice non testato, pensato per un S.O. che potrebbe non essere il tuo, in ogni caso prima di provarlo fai un backup
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso