Ottenere la rappresentazione come stringa in memoria di un valore numerico

Da Gambas-it.org - Wikipedia.

L'argomento in questione NON è quello di ottenere la rappresentazione visiva di ogni singola cifra, costitutiva del valore numerico, nel corrispondente carattere ASCII stampabile, bensì è quello di ottenere la rappresentazione del valore numerico in sé, così come sarebbe salvato in memoria (ad esempio in un file con l'ordine endiano dei suoi byte stabilito dal sistema operativo).

Non si intende ottenere quanto, ad esempio, restituito dalle funzioni "CStr()" o "Str()" di Gambas, bensì ottenere la diretta corrispondenza di ciascun dato-byte costitutivo del valore numerico (e non di ogni cifra visibile del numero) con il corrispondente carattere ASCII.

Nel primo caso, considerato ad esempio il valore numerico 1000, esso con le predette funzioni sarebbe tramutato nei corrispondenti caratteri ASCII stampabili, o meglio, ciascuna sua cifra sarebbe individuata e impostata con il corrispondente carattere ASCII stampabile.
Così, se fosse salvato in un file, aprendo il file con un editor esadecimale noi vederemmo i seguenti quattro byte (in esadecimale):

31 30 30 30

che corrispondono ai caratteri grafici stampabili del "1", dello "0", dello "0" e dello "0".


Diversamente, in questa pagina intendiamo mostrare come conservare la rappresentazione di memoria del valore, trasformando ogni suo dato-byte - e non già della cifra numerica - costitutivo nel corrispondente carattere ASCII.
Così, riprendendo l'esempio del valore 1000, esso è costituito e ugualmente salvato in memoria con i dati-byte (in little-endian e qui mostrati in esadecinale):

E8 03

Questo scopo è utile nel caso - ad esempio - in cui si vuole inserire un valore numerico in un flusso di dati salvati come caratteri stringa, ma mantenendo ovviamente il significato rappresentativo del valore numerico stesso.

Gestire valori costituiti da uno o più byte

Per realizzare, quanto sopra descritto, con valori rappresentabili da uno o più byte, si potrà fare uso - a seconda del tipo di dato - delle variabili:

MkByte(), MkShort(), MkInt(), MkLong(), MkSingle() e MkFloat()

Tali funzioni adattano il valore di tipo numerico ad essere memorizzato in un flusso di dati stringa, conservando all'interno di tale stringa di caratteri i suoi dati-byte, e quindi il compito di tali dati-byte di rappresentare il predetto valore di tipo numerico. [nota 1]

Si faccia questo esperimento:

Public Sub Main()

' Il valore numerico 1000 (in esadecimale: &h03E8):
 Dim c As Short = 1000

' La rappresentazione grafica visiva in stringa di caratteri ASCII stampabili di ciascuna cifra del numero "1000":
 Dim s As String = "1000"

 File.Save("/tmp/prova", s & MkShort(c))

End

Aprendo il file salvato con un editor esadecimale, si noterà la presenza dei seguenti valori esadecimali:

31 30 30 30 E8 03

Come già detto in precedenza, i primi quattro dati byte sono riconducibili ai caratteri ASCII stampabili che rappresentano visivamente il numero "1", lo "0", lo "0" e ancora "0" (ossia le quattro cifre che compongono il valore 1000).
Invece gli ultimi due dati-byte (E8 03) sono la rappresentazione in ordine little-Endian in memoria del valore numerico 1000, come tipo di dato "Short".
Ovviamente se fosse stato salvato come tipo di dato "Integer" mediante la funzione "MkInt()", nel file avremmo avuto:

31 30 30 30 E8 03 00 00


Gestire valori costituiti da un solo byte

Per realizzare, quanto sopra descritto, con valori rappresentabili da un solo byte, si potranno usare almeno le seguenti modalità.

Uso della funzione "Chr()"

Tale funzione richiede un solo valore-byte. [nota 1]

Public Sub Main()

 dim s as string

 s = Chr(16)
 
 Print s

End


Uso dell'escape "\x"

Tale escape deve essere seguito da un solo valore-byte esadecimale e posto in una stringa. [nota 1]

Public Sub Main()

 dim s as string

 s = "\x61"
 
 Print s

End


Note

[1] Per tornare al valore numerico, vedere questa pagina: Ottenere un valore numerico dalla rappresentazione in memoria come stringa