Differenze tra le versioni di "Convertire in un tipo di dati numerico un valore letto in formato Stringa da un file"

Da Gambas-it.org - Wikipedia.
 
(5 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
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, tra i dati del quale 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 ''<SPAN Style="text-decoration">coerente</span>'' con la loro quantità.
+
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 ''<SPAN Style="text-decoration">coerente</span>'' con la loro quantità.
  
 
Per tentare di chiarire:
 
Per tentare di chiarire:
Riga 5: Riga 5:
 
  01 01 <FONT Color=#B22222>10 27 00 00</font> 02 02 02 02
 
  01 01 <FONT Color=#B22222>10 27 00 00</font> 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''.
 
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''.
<BR>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 ' ^@ ^@
+
<BR>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ì:
<BR>Significa che all'atto dell'assegnazione di quei dati dal file alla variabile di tipo ''String'' <SPAN Style="text-decoration:underline">non</span> avviene alcuna una conversione-modifica dei valori di ciascun byte-dato, attinente al numero, nel numero del codice ASCII corrispondente al carattere della cifra rappresentata (cioè da così: &h10 &h27 &h00 &h00, a così: &h31 &h30 &h30 &h30 &h30, come quando si utilizza la funzione nativa ''CStr( )'' con un valore numerico). I valori dei byte in memoria attinenti al numero restano inalterati, diventando così pressoché illegibile e incomprensibile la sua rappresentazione testuale ad esempio in console/Terminale.
+
^P ' ^@ ^@
<BR>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).
+
viene mostrata la rappresentazione in memoria del valore "Integer" come una stringa di quattro caratteri.
 +
<BR>Significa che all'atto dell'assegnazione di quei dati dal file alla variabile di tipo ''String'' <SPAN Style="text-decoration:underline">non</span> 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()" ).
 +
<BR>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.
 +
<BR>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: <SUP>&#91;[[#Note|nota 1]]&#093;</sup>
 
Possiamo adottare almeno tre brevi modalità, utilizzando la funzione di dereferenziazione relativa al tipo di dati da ottenere: <SUP>&#91;[[#Note|nota 1]]&#093;</sup>
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
  Dim s As String
+
  Dim s As String
  Dim i As Integer
+
  Dim i As Integer
  Dim bb As Byte[]
+
  Dim bb As Byte[]
 
+
 
   s = File.Load("<FONT Color=gray>''/percorso/del/file''</font>")
 
   s = File.Load("<FONT Color=gray>''/percorso/del/file''</font>")
 
    
 
    
Riga 22: Riga 25:
 
   Print i   
 
   Print i   
 
    
 
    
  <FONT Color=gray>' ''Qui usiamo la funzione "VarPtr()" per gestire la stringa mediante il suo indirizzo di memoria,''
+
  <FONT Color=gray>' ''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:''</font> <SUP>&#091;[[#Note|Nota 2]]&#093;</sup>
' ''e per estrarre dalla stringa di dati i soli valori-byte attinenti al numero 10000:''</font>  
+
   i = <FONT Color=#B22222>Int@</font>(s[2])
   i = <FONT Color=#B22222>Int@</font>(VarPtr(s) + 2)
 
 
   Print i
 
   Print i
 
    
 
    
Riga 34: Riga 36:
 
    
 
    
 
  '''End'''
 
  '''End'''
 +
Qualora invece si intenda convertire la rappresentazione come stringa di <SPAN Style="text-decoration:underline">un solo</span> byte nel corrispondente valore numerico, si adotterà la funzione nativa "[[Asc|Asc()]]".
  
  
  
 
+
----
 
=Note=
 
=Note=
 
[1] In linguaggio C potremmo scrivere:
 
[1] In linguaggio C potremmo scrivere:
Riga 57: Riga 60:
 
      
 
      
 
  }
 
  }
 +
 +
[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|Accedere ai caratteri contenuti da una variabile di tipo stringa come se questa fosse una vettore]]

Versione attuale delle 00:42, 17 gen 2022

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