Convertire un numero da rappresentazione Decimale a Esadecimale

Da Gambas-it.org - Wikipedia.

Per convertire un numero decimale in rappresentazione esadecimale (quindi da base 10 a base 16), si potranno utilizzare diverse modalità.

Uso della funzione "Hex()"

La funzione "Hex()" restituisce, come stringa, la rappresentazione esadecimale di un numero decimale.

Esempio:

Public Sub Main()

 Dim esad As String
  
 esad = Hex(100000, 6)

 Print esa

End


Uso della funzione "Base()"

La funzione "Base()" restituisce la rappresentazione stringa di un numero in base definita nel 2° parametro, il quale deve essere un numero compreso fra 2 e 36.

Così, se vogliamo ottenere la rappresentazione stringa in esadecimale di un numero espresso in rappresentazione decimale:

Public Sub Main()

 Dim esad As String
  
 esad = Base(100000, 16)

 Print esad

End


Uso del Puntatore

Per l'uso della variabile di tipo Puntatore bisognerà assegnare a questa il valore decimale, e successivamente convertire il valore Puntatore in Stringa mediante la funzione di conversione CStr():

Public Sub Main()

 Dim p As Pointer
 Dim s As String
  
 p = 10000

 s = CStr(p)

 Print s

End

in console avremo il seguente risultato: 2710

Ovviamente si potrà utilizzare anche una variabile di tipo Intero per assegnare il valore, da convertire, al Puntatore.

Se viene utilizzata una variabile di tipo diverso dall'Intero, bisognerà assegnarla alla variabile "Puntatore" convertendola sempre in "Intero":

Public Sub Main()

 Dim p As Pointer
 Dim sh As Short = 1000
 Dim b As Byte = 99
 
 p = CInt(sh)
 Print CStr(p)
   
 p = CInt(b)
 Print CStr(p)

End


Uso di un algoritmo

Volendo, si potrà anche scrivere un apposito codice per ottenere la rappresentazione esadecimale di un numero decimale, come ad esempio quello che segue:

Public Sub Main()

 Dim n As Integer = 123456789
 Dim ss As New String[]
 Dim simboli_esadec As String[] = ["0", "1", "2", "3", "4", "5", "6", "7",
                                   "8", "9", "A", "B", "C", "D", "E", "F"]
 Dim s, ex As String

 While n > 0
   ss.Push(simboli_esadec[n Mod 16])
   n \= 16
 Wend
 
 ss.Reverse
 
 For Each s In ss
   ex &= s
 Next
 
 Print ex
 
End


Uso della funzione esterna "sprintf()"

La funzione "sprintf()" della libreria dinamica condivisa esterna "libc.so.6 " scrive in un'array di caratteri terminanti con il valore \0 Null (quindi in una stringa) un dato formattato nella modalità indicata nel 2° parametro.

Per ottenere la formattazione di un valore numerico in rappresentazione esadecimale (base 16), sarà sufficiente indicare nel secondo parametro della funzione esterna "sprintf()" la seguente stringa: "%.8X ".

Mostriamo un esempio pratico:

Library "libc:6"

' int sprintf (char *__restrict __s, const char *__restrict __format, ...)
' Write formatted output to S.
Private Extern sprintf(__ As Pointer, __format As String, i As Integer) As Integer


Public Sub Main()
 
 Dim esad As Pointer
 
' E' necessario passare alla funzione esterna "sprintf()" un'area di memoria allocata, nella quale essa potrà scrivere il risultato:
 esad = Alloc(SizeOf(gb.Byte), 8) 
 
 sprintf(esad, "%.8X", 12345)
   
' Dereferenzia il Puntatore, per ottenere il risultato fornito dalla funzione esterna "sprintf()":
 Print String@(esad)
   
' Libera la memoria precedentemente allocata e si assicura che il Puntatore non punti ad una cella di memoria rilevante:
 Free(esad)
 esad = 0
  
End