Pagina 1 di 2

Conversione da esadecimale ad ascii

MessaggioInviato: 21 nov 2015, 1:06
da Shika93
Ho bisogno di convertire un numero esadecimale, nello stesso numero in ascii.
Per esempio: se ho 2d esadecimale (45 decimale) voglio che diventi 0x3435 dove appunto 0x34=4 e 0x35=5.

Come faccio? Non conosco nessun metodo di trasformazione e su internet non trovo niente.

Re: Conversione da esadecimale ad ascii

MessaggioInviato: 21 nov 2015, 1:19
da IlGuru
Con un linguaggio in particolare o cerchi un algoritmo generale?

Re: Conversione da esadecimale ad ascii

MessaggioInviato: 21 nov 2015, 1:42
da Candy
Se il numero è una variabile numerica, allora il problema non si pone, almeno che non sia una variabile BCD.
Poi, in base al linguaggio che usi, puoi fare uso delle comuni funzioni di formattazione della libreria standard, oppure, se proprio non ne hai la possibilità, ti scrivi un loop che: partendo dalla prima unità peschi in un array di caratteri il corrispondente ASCII, e poi dividi per dieci, ripetendo tutto finché non hai finito tutto il numero.

Esempio di getto:

Codice: Seleziona tutto
iNumber : INT := 45;
sAsciiTable : STRING[16] := '0123456789ABCDEF';
sResult : STRING[16] := '';
iAcc1 : INT;
iAcc2 : INT;
iAcc3 : INT;

iAcc3 := iNumber;
while iAcc3 > 0 do
  iAcc2 := iAcc3 MOD 10;
  sResult := CONCAT(IN1 := sAsciTable[iAcc2], IN2 := sResult);
  iAcc3 := iAcc3 / 10;
end_while;
sResult := CONCAT(IN1 := '0x', IN2 := sResult);

Re: Conversione da esadecimale ad ascii

MessaggioInviato: 21 nov 2015, 1:48
da Shika93
Assembler.
Uso solo esadecimali. Sto però facendo un programma in cui necessito sommare due costanti decimali e (per stamparle a video come stringa di caratteri) devo convertire il risultato in ascii.
Candy ha scritto:ti scrivi un loop che: partendo dalla prima unità peschi in un array di caratteri il corrispondente ASCII, e poi dividi per dieci, ripetendo tutto finché non hai finito tutto il numero.

Non ho capito.
Sono una capra in programmazione ma purtroppo mi tocca pure questa.

Re: Conversione da esadecimale ad ascii

MessaggioInviato: 21 nov 2015, 2:53
da IlGuru
Riserva un array di 16 byte dove metti i codici ascii dei numeri esadecimali da 0 a 9 e da A ad F.
Poi diciamo che conosci la dimensione in byte della variabile che contiene il numero, es 4 byte.
Prendi il nibble più basso, diciamo che contiene 5,vai a prendere il quinto byte dell' array e lo stampi.
Sposti il cursore davanti al numero stampato.
Shifti a destra il numero di 4 bit, che equivale a dividere per 16
Prendi il nibble più basso e stampi come prima.
Ripeti per gli altri 3 byte del numero

Re: Conversione da esadecimale ad ascii

MessaggioInviato: 21 nov 2015, 3:11
da simo85
Foto UtenteShika93 non hai specificato l'architettura e SO con cui programmi.
Sei tu che programmi per architettura MIPS?

Re: Conversione da esadecimale ad ascii

MessaggioInviato: 21 nov 2015, 8:50
da IsidoroKZ
IlGuru ha scritto:Riserva un array di 16 byte dove metti i codici ascii dei numeri esadecimali da 0 a 9 e da A ad F.


Dall'esempio che fa pare voglia anche convertirlo in decimale.

Re: Conversione da esadecimale ad ascii

MessaggioInviato: 21 nov 2015, 11:22
da IlGuru
Scusate, nel titolo diceva esadecimale

Re: Conversione da esadecimale ad ascii

MessaggioInviato: 21 nov 2015, 11:37
da Shika93
Si, mips. Avevo cominciato a fare il programma tempo fa ma poi l'avevo abbandonato lì perché mi stava antipatico.
Io stampo una stringa di caratteri tra cui in mezzo questa costante. Però non posso stampare un byte in mezzo ad una stringa di caratteri, no? Per questo necessito di un modo per convertire il numero hex che ho, nella stesso numero (decimale) ma in ascii.
Nel titolo ho messo esadecimale-ascii perché se voglio stampare 0x41 a schermo, io non vedrei 65 decimale? O mi torna 0x41? perché se è così allora ho cannato il titolo.

La soluzione di Foto UtenteIlGuru mi pare faccia quello che devo, no? Converto il mio valore hex in decimale e ad ogni numero decimale gli associo il corrispondente carattere ascii.

Edit: ho pensato ad una costante in byte e poi convertirla perché avrei potuto inserirla come stringa ascii (decimale), solo che poi avrei dovuto convertirla in esadecimale sommare quello che mi serve e riconvertire in ascii. In questo mi tocca fare due conversioni contro una sola

Re: Conversione da esadecimale ad ascii

MessaggioInviato: 21 nov 2015, 12:04
da IlGuru
No, quello che ho scritto è un algoritmo per visualizzare il valore di un nunero esadecimale. Quello che devi fare tu in assembler non è semplice, lo sarebbe con un linguaggio di programmazione di livello più alto.
In sostanza devi dividere il numero A per dieci ottenendo un intero B ed il resto R, e stampare il codice corrispondente ad R. Poi applicare lo stesso procedimento a B fino a che non arrivi ad un punto in cui B vale 0.
Dividere per 10 significa contare quante volte 10 sta in un numero, ad esempio sottraendo 10 da una copia di quel numero fino a che il numero resta positivo.
Il programma da scrivere si ridurrebbe molto in dimensioni utilizzando delle funzioni, ma devi sapere come salvare e prelevare i valori dalla pila di sistema prima e dopo le chiamate alle funzioni, insomma un po' più complicato che usare mille cicli.