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.
Riga 1: Riga 1:
Il caso in oggetto è quello in cui viene caricato in memoria <SPAN Style="text-decoration:underline">in formato ''String''</span> (ad esempio mediante il Metodo "''File.Load( )''"), un file, tra i dati del quale vi sono anche quelli che rappresentano un numero. Lo scopo è quello di estrapolare i byte di dati attinenti a quel numero, di mostrare in console il numero, e di memorizzare quei byte in una variabile del tipo ''coerente'' con la quantità di quei medesimi byte che rappresentano il numero.
+
Il caso in oggetto è quello in cui viene caricato in memoria <SPAN Style="text-decoration:underline">in formato ''String''</span> (ad esempio mediante il Metodo "''File.Load( )''"), un file, tra i dati del quale vi sono anche quelli che rappresentano un numero secondo un tipo di dati numerico (''Byte'', ''Short'', ''Integer'', etc.). 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 ''<SPAN Style="text-decoration">coerente</span>'' con la loro quantità.
  
Per chiarire, poniamo ad esempio che un file contenga i byte costituenti il numero 10000 (diecimila), posti in mezzo ad altri byte di dati; ad esempio così:
+
Per chiarire, poniamo ad esempio 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 <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 lì memorizzati in ordine ''little-endian''. Essendo 4 i byte, costituenti il numero, si dovrà, dunque, convertire quei byte, caricati come dati stringa, nel tipo Intero (''Integer'').
+
I 4 byte di dati, colorati in rosso, sono quelli relativi al valore 10000, che sono stati lì 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 corrisppondente numero del codice ASCII, ossia in questo caso così: ^P ' ^@ ^@
 +
<BR>Essendo 4 i byte, costituenti il numero, si dovrà, dunque, ri-convertire quei byte, caricati come dati stringa, nel tipo Intero (''Integer'').
  
 
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>

Versione delle 01:15, 10 apr 2018

Il caso in oggetto è quello in cui viene caricato in memoria in formato String (ad esempio mediante il Metodo "File.Load( )"), un file, tra i dati del quale vi sono anche quelli che rappresentano un numero secondo un tipo di dati numerico (Byte, Short, Integer, etc.). 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 coerente con la loro quantità.

Per chiarire, poniamo ad esempio 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 lì 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 corrisppondente numero del codice ASCII, ossia in questo caso così: ^P ' ^@ ^@
Essendo 4 i byte, costituenti il numero, si dovrà, dunque, ri-convertire quei byte, caricati come dati stringa, nel tipo Intero (Integer).

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 usiamo la funzione "VarPtr()" per gestire la stringa mediante il suo indirizzo di memoria,
' e per estrarre dalla stringa di dati i soli valori-byte attinenti al numero 10000: 
  i = Int@(VarPtr(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



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);
   
}