PDA

Visualizza la versione completa : da base dec a base esa


informatici
25-04-2008, 14:40
ciao a tutti ho iniziato una nuova sfida, questa volta ho deciso di convertire un numero da base 10 a base 16...ho pertanto creato una funzione di questo tipo:

void dec2hex(unsigned short input, char hexstring[4])
{
int i;
for (i=0; i<4; i++)
{
hexstring[4-1-i]=input%16;
input/=16;
}
}

La mia domanda dunque è questa: esiste un modo analogo a:
hexstring[4-1-i]=input%16;
per fare la stessa cosa, in parole povere in quale altro modo si può scrivere quella stringa di codice?

andbin
25-04-2008, 15:15
Originariamente inviato da informatici
La mia domanda dunque è questa: esiste un modo analogo a:
hexstring[4-1-i]=input%16;
per fare la stessa cosaInnanzitutto basta notare che fare il modulo 16 equivale praticamente a fare la AND del valore con 15 (0xF). E fare la divisione per 16 equivale a fare lo shift a destra (>>) di 4 bit del valore.

Poi comunque quel tuo codice non è completo. Hai sì ottenuto i valori delle singole cifre esadecimali (0-15) ma se vuoi memorizzarle come caratteri devi ottenere valori '0'...'9' 'A'...'F' (o le minuscole). Altrimenti nel tuo array hai solo dei char con valori 0-15 che non sono certo caratteri stampabili.

informatici
25-04-2008, 15:24
Quindi te come faresti? Intendo dire come codice.

mondobimbi
25-04-2008, 15:37
per trasformare un numero tra 0 e 15 in un hex puoi usare


char n2hex (short n)
{
return n < 9 ? '0' + n : 'A' + n - 10;
}

ciao

andbin
25-04-2008, 15:39
#include <stdio.h>

char* formatHex (unsigned short input, char *hexstr)
{
int i;
unsigned short d;

for (i = 0; i < 4; i++)
{
d = input & 0xF;
hexstr[3-i] = (char) (d > 9 ? d+'A'-10 : d+'0');
input >>= 4;
}

hexstr[4] = '\0';
return hexstr;
}

int main (void)
{
unsigned short n = 29611; /* 73AB in hex */
char buf[5];

printf ("%s\n", formatHex (n, buf));
return 0;
}

informatici
25-04-2008, 15:46
Grazie un ultima domanda se io invece volessi usare questo prototipo di funzione, che deve rimanere inalterato:

void dec2hex(unsigned short input, char hexstring[4])
{
CORPO DELLA FUNZIONE
}

cosa scrivereste all'interno del CORPO DELLA FUNZIONE?
grazie ancora

andbin
25-04-2008, 15:53
Originariamente inviato da informatici
cosa scrivereste all'interno del CORPO DELLA FUNZIONE?Beh, scusa, il mio esempio non è chiaro? Con il tuo prototipo le uniche cose che non puoi fare sono mettere il nullo finale e ritornare il puntatore come invece ho fatto io.
Chi userà la tua funzione deve sapere che la stringa non è terminata dal nullo.

informatici
25-04-2008, 16:03
Giusto, ora sapendo che la mia stringa non è terminata dal vettore nullo, riusciresti a trovare
un'alternativa di funzione, utilizzando il prototipo che ho scritto sopra?
L'unica cosa per l'appunto che bisogna sapere è questa:

Il vettore di caratteri hexstring NON è una stringa di caratteri, perché non è presente il
carattere di terminazione ‘\0’. Non si possono quindi utilizzare su questo vettore le
funzioni di manipolazione delle stringhe (strcpy, strcat, ecc.).
Non è consentito l’uso della funzione pow o di altre funzioni per l’elevamento a potenza.
La dichiarazione delle funzioni deve rimanere inalterata (il prototipo non va cambiato per nessun motivo).
La stampa a video del risultato finale deve riportare la posizione delle cifre seguendo l’ordine: maggiore cifra significativa…minore cifra significativa.

mondobimbi
25-04-2008, 16:13
ma scusa non lo puoi fare tu? quali difficoltà trovi? mi sembra che la conversione sia banale.
ciao
sergio

andbin
25-04-2008, 16:15
Originariamente inviato da informatici
Giusto, ora sapendo che la mia stringa non è terminata dal vettore nullo, riusciresti a trovare
un'alternativa di funzione, utilizzando il prototipo che ho scritto sopra?In che senso "alternativa"???? Guarda che nel mio esempio basterebbe togliere le ultime 2 righe della funzione (appunto quella che mette il nullo e l'altra che ritorna il puntatore) per avere un corpo che sarebbe assolutamente appropriato per il tuo prototipo!

Poi come ho detto il chiamante deve sapere che la stringa non è null-terminated e quindi ... deve arrangiarsi se vuole stamparla: copiando i 4 caratteri in un altro buffer facendo poi seguire il nullo, stampando semplicemente i caratteri uno per volta o altro.

Loading