Differenze tra le versioni di "Ottenere un numero dalla sua memorizzazione in formato Big-Endian"
Riga 1: | Riga 1: | ||
− | Il caso è quello in cui si intende convertire i dati di un valore, memorizzati in formato Big-Endian all'interno di un file o di un vettore di tipo Byte[], ottenendo così al termine l'effettivo numero corrispondente (ossia corrispondente esattamente alla disposizione dei byte in formato ''big-endian''). | + | Il caso è quello in cui si intende convertire i dati di un valore, memorizzati in formato Big-Endian a dimensione fissa all'interno di un file o di un vettore di tipo Byte[], ottenendo così al termine l'effettivo numero corrispondente (ossia corrispondente esattamente alla disposizione dei byte in formato ''big-endian''). |
Riga 36: | Riga 36: | ||
Print ris | Print ris | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | oppure: | ||
+ | '''Public''' Sub Main() | ||
+ | |||
+ | Dim bb As Byte[] = [&01, &02, &03, &04] | ||
+ | Dim i As Integer | ||
+ | |||
+ | i = bb[3] | ||
+ | i += bb[2] * 256 <FONT Color=gray>' ''&0100''</font> | ||
+ | i += bb[1] * 65536 <FONT Color=gray>' ''&010000''</font> | ||
+ | i += bb[0] * 16777216 <FONT Color=gray>' ''&01000000''</font> | ||
+ | |||
+ | Print i | ||
'''End''' | '''End''' |
Versione delle 20:41, 20 feb 2016
Il caso è quello in cui si intende convertire i dati di un valore, memorizzati in formato Big-Endian a dimensione fissa all'interno di un file o di un vettore di tipo Byte[], ottenendo così al termine l'effettivo numero corrispondente (ossia corrispondente esattamente alla disposizione dei byte in formato big-endian).
Caso di memorizzazione in un vettore di tipo Byte[]
Porremo come esempio un vettore di tipo Byte[] di quattro elementi, contenente i seguenti valori: &01, &02, &03 e &04. Per ottenere il corrispondente numero decimale - che è 16909060 - potremo utilizzare due modalità:
Public Sub Main() Dim bb As Byte[] = [&01, &02, &03, &04] Dim i As Integer i = bb[0] i = i * CInt(2 ^ 8) i = i Or (bb[1] And 127) i = i * CInt(2 ^ 8) i = i Or (bb[2] And 127) i = i * CInt(2 ^ 8) i = i Or (bb[3] And 127) Print i End
oppure:
Public Sub Main() Dim q As Byte Dim bb As Byte[] = [&01, &02, &03, &04] Dim ris As Integer Do ris = (ris * CInt(2 ^ 8)) Or bb[q] Inc q Loop Until q = bb.Count Print ris End
oppure:
Public Sub Main() Dim bb As Byte[] = [&01, &02, &03, &04] Dim i As Integer i = bb[3] i += bb[2] * 256 ' &0100 i += bb[1] * 65536 ' &010000 i += bb[0] * 16777216 ' &01000000 Print i End
o usando le risorse Stringa con conversione finale in valore numerico in rappresentazione decimale:
Public Sub Main() Dim bb As Byte[] = [&01, &02, &03, &04] Dim s As String Dim i As Integer s = Hex(bb[0], 2) & Hex(bb[1], 2) & Hex(bb[2], 2) & Hex(bb[3], 2) i = Val("&" & s) Print i End
Esempi usando la lettura dei dati da un file
Mostriamo ora due esempi di lettura da un file dei suoi dati memorizzati in Big-Endian. Va precisato che le due modalità appresso mostrate possono essere utilizzate ovviamente anche per convertire valori presenti - come sopra - in vettori di tipo Byte[ ].
Public Sub Main() Dim fl As File Dim bb As Byte[] Dim i As Integer fl = Open "/percorso/del/file" For Read ' Legge ad esempio 32 bit (4 byte): With bb = New Byte[4] .Read(fl, 0, 4) .Reverse() End With i = Int@(bb.Data) Print i End
oppure:
Public Sub Main() Dim fl As File Dim b, c As Byte Dim j As Integer fl = Open "/percorso/del/file" For Read ' Legge ad esempio 32 bit (4 byte): b = 4 Do Read #fl, c j = (j * CInt(2 ^ 8)) Or c Dec b Loop Until b = 0 Print j End
Laddove in questa seconda modalità:
- "fl" è la variabile del file contenente i byte del numero disposti in Big-Endian;
- "b" è la variabile contenente la quantità (2, 4 oppure 8) di byte, disposti in Big-Endian, che costituiscono il numero e quindi che devono essere letti;
- "c" è la variabile che contiene il valore del singolo byte letto dal file;
- "j" è la variabile contenente il risultato.