Convertire in un tipo di dati numerico un valore letto in formato Stringa da un file

Da Gambas-it.org - Wikipedia.

Il caso in oggetto è quello in cui viene caricato in memoria - in una variabile di tipo String - (ad esempio mediante il Metodo "File.Load()" ), un file di dati, tra i quali sono memorizzati in Little-Endian secondo un coerente tipo di dati numerico (Byte, Short, Integer, etc.) anche quelli relativi a un numero. Lo scopo è quello di estrarre i byte di dati attinenti a quel numero, di mostrare in console il numero, e di memorizzare quei byte in una variabile del tipo numerico coerente con la loro quantità.

Per tentare di chiarire:
poniamo che un file contenga i byte costituenti il numero 10000 (diecimila) secondo il tipo di valori Integer, posti in mezzo ad altri byte di dati; ad esempio così:

01 01 10 27 00 00 02 02 02 02

I 4 byte di dati, colorati in rosso, sono quelli relativi al valore 10000, che sono stati nel file memorizzati coerentemente - come appena detto - con il tipo di valori gb.Integer e in ordine little-endian.
Quando quei dati vengono caricati in formato stringa, se stampati in console, ciascuno di loro assume l'aspetto conferito dal corrispondente numero del codice ASCII, ossia in questo caso così:

^P ' ^@ ^@

viene mostrata la rappresentazione in memoria del valore "Integer" come una stringa di quattro caratteri.
Significa che all'atto dell'assegnazione di quei dati dal file alla variabile di tipo String non avviene alcuna conversione-modifica dei valori di ciascun byte-dato del numero originario, nel valore del codice ASCII corrispondente al carattere della cifra rappresentata (insomma da così: &h10 &h27 &h00 &h00, a così: &h31 &h30 &h30 &h30 &h30, come avviene invece quando si utilizza la funzione nativa "CStr()" ).
Nel nostro caso i valori dei byte in memoria attinenti al numero restano inalterati, diventando così pressoché illeggibile e incomprensibile la sua rappresentazione testuale ad esempio in console/Terminale.
Infine, essendo 4 i byte, costituenti il numero, si dovrà, dunque, ri-assegnare quei byte, caricati in una stringa, a una variabile tipo Intero (Integer). Per questa operazione appare, però, impossibile e privo di senso l'uso della funzione nativa "Val()", non essendo avvenuta - come già detto - una modifica dei valori dei byte afferenti al numero in coerenza con la rappresentazione di tipo testuale-stringa del numero originario secondo il codice ASCII (ossia: &h31 &h30 &h30 &h30 &h30).

Possiamo adottare almeno tre brevi modalità, utilizzando la funzione di dereferenziazione relativa al tipo di dati da ottenere: [nota 1]

Public Sub Main()
 
  Dim s As String
  Dim i As Integer
  Dim bb As Byte[]

  s = File.Load("/percorso/del/file")
  
' Qui usiamo la funzione "Mid()" per estrarre dalla stringa di dati i soli valori-byte attinenti al numero 10000:
  i = Int@(Mid(s, 3, 4))
  Print i   
  
' Qui operiamo con la variabile di tipo stringa, come fosse un vettore, per estrarre dalla stringa di dati i soli valori-byte attinenti al numero 10000: [Nota 2]
  i = Int@(s[2])
  Print i
  
' Qui sfruttiamo l'area di memoria di un vettore di tipo "Byte[]" mediante il suo indirizzo di memoria,
' restituito dalla proprietà ".Data", nella quale carichiamo i singoli dati del numero dalla stringa:
  bb = Byte[].FromString(s)
  i = Int@(bb.Data + 2)
  Print i
  
End

Qualora invece si intenda convertire la rappresentazione come stringa di un solo byte nel corrispondente valore numerico, si adotterà la funzione nativa "Asc()".



Note

[1] In linguaggio C potremmo scrivere:

#include <stdio.h>


int main() {

   FILE *fl = fopen("/percorso/del/file",  "r");
   char ptr[10];
   
   fread(ptr, sizeof(char), 10, fl);
   
   printf("%.8x\n", *((unsigned int *) (ptr+2)) );
   
   fclose(fl);
   
   return (0);
   
}

[2] Al riguardo vedere la seguente pagina della wiki: Accedere ai caratteri contenuti da una variabile di tipo stringa come se questa fosse una vettore