Differenze tra le versioni di "Convertire in un tipo di dati numerico un valore letto in formato Stringa da un file"
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 lì 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, tra i dati del quale sono lì 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 chiarire | + | Per tentare di chiarire: |
+ | <BR>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 <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ì: ^P ' ^@ ^@ | ||
− | <BR> | + | <BR>Significa che all'atto dell'assegnazione di quei dati dal file alla variabile di tipo ''String'' non avviene 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. |
− | + | <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). | |
− | Infine, essendo 4 i byte, costituenti il numero, si dovrà, dunque, ri- | ||
Possiamo adottare almeno tre brevi modalità, utilizzando la funzione di dereferenziazione relativa al tipo di dati da ottenere: <SUP>[[[#Note|nota 1]]]</sup> | Possiamo adottare almeno tre brevi modalità, utilizzando la funzione di dereferenziazione relativa al tipo di dati da ottenere: <SUP>[[[#Note|nota 1]]]</sup> |
Versione delle 02:06, 10 apr 2018
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 lì 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 ' ^@ ^@
Significa che all'atto dell'assegnazione di quei dati dal file alla variabile di tipo String non avviene 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.
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 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); }