Articolo dedicato alla traduzione in HTML e PHP dell'algoritmo per la conversione da esadecimale a decimale; lo script PHP deve essere in grado di rilevare eventuali
errori sintattici nella stringa immessa in input, cioè deve controllare che nella stringa immessa ci siano solo caratteri compesi nell'intervallo '0'...'9' (codici ASCII 48...57) e 'A'...'F' (codici ASCII 65...70).
Risorse collegate
Per un più approfondito commento di tale argomento, puoi scaricare qui il PDF
Se ti interessa il video della codifica in HTML+PHP
Articolo dedicato alla traduzione in HTML e PHP dell'algoritmo per la conversione da esadecimale a decimale; lo script PHP deve essere in grado di rilevare eventuali errori sintattici nella stringa immessa in input, cioè deve controllare che nella stringa immessa ci siano solo caratteri compesi nell'intervallo '0'...'9' (codici ASCII 48...57) e 'A'...'F' (codici ASCII 65...70).
Scriveremo due file il primo sarà un file HTML che realizzerà un form per l'immissione del numero esadecimale, il secondo sarà uno script PHP che effettuerà i controlli sintattici ed eventualmente convertire il numero esadecimale in decimale.
Questo è il form:
<html>
<head>
<title>conversione da esadecimale a decimale</title>
<link href="/stile.css" rel='stylesheet' type='test/css'>
</head>
<body>
<h1> conversione da esadecimale a decimale </h1>
<form name='esadecimale' method='POST' action='convertie2d.php'>
Inserisci un numero esadecimale <input type='text' name='numesa' size='20'><br><br>
<input type='submit' value='converti' >
<input type='reset' value='cancella' >
</form>
</body>
</html>
Due cose sono interessanti in questo frammento di HTML:
- linea 10: Il nome dello script PHP che deve essere richiamato quando viene premuto il tasto submit (nel nostro caso è convertie2d.php, che va impostato nell'attributo action del tag form)
- linea 10:il metodo utilizzato per inviare i dati allo script (POST)
- linea 12:Il nome della casella di testo (nel nostro caso numesa) che consentirà allo script PHP di recuperare il dato immesso nella stessa casella.
Di seguito l'altro file, lo script convertie2d.php:
<?php
//recupero dei dati dal form
$esa=$_POST['numesa'];
//calcola la lunghezza della stringa immessa
$l=strlen($esa);
//contatori di errori
$nerrori=0;
//memoria dei messaggi da visualizzare
$buffer='';
//trasforma tutti i caratteri immessi in maiuscolo
$esa=strtoupper($esa);
//scansione della stringa immessa
for($k=0;$k<$l;$k++){
//estrazione del singolo carattere a partire dalla posizione k
$carattere=substr($esa,$k,1);
// se il carattere non è valido...
if($carattere<'0' || ($carattere>'9' && $carattere<'A')||$carattere>'F'){
$nerrori++; //incrementa contatore errori
// $buffer.="errore in posizione $k<br>"; //memorizza la posizione in cui è stato trovato l'errore
$buffer.="<span style='color:red'>$carattere</span>";
}else{
$buffer.=$carattere;
}
}
//a questo punto la scansione della stringa è terminata
// se sono stati rilevati errori
if($nerrori>0){
//visualizza messaggio
$buffer="la stringa $buffer immessa non è valida.<br>";
}else{
//se la stringa è corretta
$risultato=0;
// nuova scansione della stringa
for($k=0;$k<$l;$k++){
//estrae il singolo carattere
$carattere=substr($esa,$k,1);
if($carattere<='9'){
// se il carattere è una cifra araba...(nota: la funzione ord restituisce il codice ASCII di un carattere) (vedere tabella codici Ascii su Internet)
$valore=ord($carattere)-48;//oppure -48 invece di -"0"
}else{
// se il carattere è una lettera
$valore=ord($carattere)-55;
}
// simoltiplica il risultato precedente per 16 e si aggiunge il nuovo valore
$risultato=$risultato*16+$valore;
}
// prepara il messaggio da mostrare in output
$buffer="$esa in decimale si scrive $risultato";
}
//mostra il risultato
echo$buffer;
?>
Spiegazione dello script:
- Si comincia con il recupero dei dati immessi nel form ($esa=$_POST['numesa'];) (linea 3) e si calcola una volta per tutte la lunghezza della stringa immessa ($l=strlen($esa);) (linea 5)
- Il passo successivo prevede la scansione (linee 13-25) della stringa immessa per verificare se ciascun carattere è valido: se il carattere sta al di fuori dell'intervallo '0'...'9' o 'A'...'F' (linea 17) viene incrementato un contatore di errori ($nerrori) (linea 15) e contestualmente viene predisposto un messaggio di errore che alla fine mostrerà la stringa immessa con gli eventuali caratteri non validi colorati di rosso. Notare l'operatore di concatenazione fra stringhe (punto davanti al simbolo '=' ).
- Il singolo carattere viene estratto alla linea 15 usando la funzione substr alla quale bisogna fornire in input ordinatamente la stringa da cui estrarre, la posizione da cui partire per l'estrazione e la lunghezza della sottostringa da estrarre; nel nostro caso la posizione viene indicata dal valore della variabile $k che scorre da 0 fino alla lunghezza della stringa, mentre la lunghezza della sottostringa da estrarre è 1: l'effetto finale è quello di scandire la stringa iniziale ed estrarre di volta in volta un carattere.
- Alla fine della scansione si controlla il numero degli errori (linea 29) e se esso è maggiore di zero viene emesso il messaggio di errore predisposto e lo script termina la propria esecuzione con la linea 57 con l'struzione echo $buffer;. Se invece il numero degli errori è uguale a zero, la stringa è valida e quindi si può procedere con la conversione:
- Per la conversione è stato utilizzato l'algoritmo di KRONECKER; si incomincia con impostare una variabile chiamata $risultato a zero (linea 24).
- poi viene eseguita una scansione della stringa da sinistra verso destra (linee 37-51) per esaminare ciascun carattere: in ciascun ciclo, è dapprima calcolato il valore corrispondente alla cifra esaminata (linee 41-47 con una conversione da carattere ASCII a valore numerico (linea 43 e linea 46) nelle quali si utilizza la funzione ord() per ottenere il codice ASCII del carattere; al valore ottenuto viene sottratto 48 (codice ASCII di '0') o 55 a seconda che si tratti di una cifra araba o di una lettera (Perchè 55? il codice ASCII della lettera "A" è 65 e i valore che vogliamo attribuire è 10; il codice ASCII della lettera "B" è 66 e i valore che vogliamo attribuire è 11...la differenza è sempre 55!); il contenuto della variabile $risultato viene moltiplicato per la base del sistema di numerazione di partenza (nel nostro caso 16) e al risultato viene aggiunto il valore della cifra che si sta esaminando (linea 49). Quando avremo finito la scansione nella variabile $risultato ci sarà il risultato della conversione da esadecimale che sarà emesso con la linea 57.