Ottenere da un valore numerico i caratteri ASCII corrispondenti a ciascun byte componente il numero

Da Gambas-it.org - Wikipedia.

Come è noto, ogni carattere alfanumerico, compresi i segni di punteggiatura, corrisponde ad un valore di 8 bit (1 byte) all'interno del codice ASCII. Pertanto, quando tali caratteri vengono immagazzinati in memoria o salvati in un file, in realtà viene salvato il corrispondente valore numerico ASCII.

Vediamo alcune modalità per ottenere da un numero [nota 1] i diretti corrispondenti caratteri ASCII a ciascun valore-byte [nota 2] che costituisce il numero medesimo nel rispetto della propria posizione all'interno della rappresentazione esadecimale del numero. In altre parole, si convertirà un gruppo di due o più valori ASCII (come fossero le cifre di un unico numero) in rispettivi caratteri alfanumerici.


Caso in cui il numero è formato da un solo byte

Se il numero è composto da un solo byte, è possibile utilizzare semplicemente la funzione "Chr():

Public Sub Main()

 Print Chr(&61)

End


Uso di una variabile vettoriale di tipo "Byte[]"

Mostriamo il caso in cui vengono letti quattro valori-byte da un file in cui sono contenuti i suoi byte costituenti, letti dal Metodo ".Read()" i un array di tipo "Byte[]", e infine vengono mostrati i corrispondenti caratteri ASCII:

Public Sub Main()
  
 Dim fl As File
 Dim bb As Byte[]
   
 fl = Open "/percorso/del/file/contenente/il/numero" For Read
  
 With bb = New Byte[](4)
   .Read(fl, 0, 4)
' In questo caso possiamo usare il Metodo ".ToString()", poiché conosciamo la quantità di caratteri che formano il testo:
   Print .ToString(0, bb.Count)
 End With
   
 fl.Close
  
End


Caso in cui due o più valori ASCII vengono letti come fossero cifre di un unico numero

Questo caso è sostanzialmente simile al precedente.
Poiché i valori ASCII, come già detto, sono numeri, due o più valori potranno essere letti come fossero cifre di un unico grande numero e successivamente recuperati, mostrando quindi il carattere alfanumerico al quale ciascun valore corrisponde.

Nell'esempio che segue, il numero viene letto da una variabile numerica (ad esempio di tipo "Intero Lungo"):

Public Sub Main()
 
 Dim l As Long
 Dim bb As Byte[]
 
' I valori, ciascuno corrispondente ad un singolo carattere, devono essere posti al contrario (in questo esempio dunque: sabmaG):
 l = &h7361626d6147   ' 126862100357447
  
 bb = Byte[].FromString(MkLong(l))
  
 Print String@(bb.Data), bb.ToString(0, bb.Find(0))
  
End


Uso di una variabile di tipo Puntatore

Si potrà utilizzare anche una variabile di tipo Puntatore.

Vediamo un esempio, nel quale si assegna ad una variabile di tipo Long il valore risultante dai singoli valori esadecimali (anche in questo caso, come il precedente, non sommati, bensì semplicemente posti uno vicino all'altro della parola "Gambas". Anche in questo caso, come nel precedente, i valori, ciascuno corrispondente ad un singolo carattere, devono essere posti al contrario (in questo esempio dunque: sabmaG).
Successivamente si otterrà una variabile di tipo Puntatore che punti alla predetta variabile Long. Infine si otterranno i caratteri ASCII mediante il processo inverso di dereferenziazione della variabile di tipo Puntatore.

Public Sub Main()
 
 Dim p As Pointer
 Dim l As Long
 
 l = &h7361626d6147   ' 126862100357447
 p = VarPtr(l)
  
' Dereferenziamo la variabile di tipo Puntatore:
 Print String@(p)
  
End



Note

[1] Negli esempi presenti in questa pagina si è preferito utilizzare la rappresentazione esadecimale del numero per visualizzare più chiaramente la diretta corrispondenza fra valore esadecimale di un singolo byte, che costituisce il numero, e il corrispondente carattere ASCII.

[2] Per ottenere invece il valore dei caratteri alfanumerici che costituiscono un testo, vedere questa pagina:
Ottenere il valore ASCII di un carattere