Differenze tra le versioni di "Ottenere un numero dalla sua memorizzazione in formato Big-Endian"
Da Gambas-it.org - Wikipedia.
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. | 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. | ||
− | Porremo come esempio un vettore di tipo Byte[] di tre elementi contenente i seguenti valori: &FF, &FF, &FF. Per ottenere il corrispondente numero potremo utilizzare due modalità: | + | |
+ | ===Caso di memorizzazione in un vettore di tipo Byte[]=== | ||
+ | Porremo come esempio un vettore di tipo Byte[] di tre elementi, contenente i seguenti valori: &FF, &FF, &FF. Per ottenere il corrispondente numero decimale potremo utilizzare due modalità: | ||
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
Riga 29: | Riga 31: | ||
− | + | ===Caso di lettura dei dati da un file=== | |
− | ''' | + | Nel caso di lettura da un file dei suoi dati memorizzati in ''Big-Endian'' possiamo anche qui adottare almeno due modalità. |
+ | '''Public''' Sub Main() | ||
− | + | Dim fl As File | |
− | + | Dim bb As Byte[] | |
+ | Dim i As Integer | ||
− | + | fl = Open "<FONT Color=gray>''/percorso/del/file''</font>" For Read | |
− | + | ||
− | + | <FONT Color=gray>' ''Legge ad esempio 32 bit (4 byte):''</font> | |
− | + | With bb = New Byte[4] | |
− | + | .Read(fl, 0, 4) | |
+ | .Reverse() | ||
+ | End With | ||
+ | |||
+ | i = Val("&" & CStr(Pointer@(bb.data))) | ||
+ | |||
+ | Print i | ||
+ | |||
+ | '''End''' | ||
+ | oppure: | ||
+ | '''Public''' Sub Main() | ||
+ | |||
+ | Dim fl As File | ||
+ | Dim b, c As Byte | ||
+ | Dim j As Integer | ||
− | + | fl = Open "<FONT Color=gray>''/percorso/del/file''</font>" For Read | |
+ | |||
+ | <FONT Color=gray>' ''Legge ad esempio 32 bit (4 byte):''</font> | ||
+ | b = 4 | ||
+ | |||
+ | Do | ||
+ | Read #fl, c | ||
+ | j = (j * CInt(2 ^ 8)) Or c | ||
+ | Dec b | ||
+ | Loop Until b = 0 | ||
+ | |||
+ | Return j | ||
'''End''' | '''End''' | ||
− | Laddove: | + | Laddove in questa seconda modalità: |
* "''fl''" è la variabile del file contenente i byte del numero disposti in ''Big-Endian''; | * "''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; | * "''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; | * "''c''" è la variabile che contiene il valore del singolo byte letto dal file; | ||
* "''j''" è la variabile contenente il risultato. | * "''j''" è la variabile contenente il risultato. |
Versione delle 10:06, 30 ott 2015
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.
Caso di memorizzazione in un vettore di tipo Byte[]
Porremo come esempio un vettore di tipo Byte[] di tre elementi, contenente i seguenti valori: &FF, &FF, &FF. Per ottenere il corrispondente numero decimale potremo utilizzare due modalità:
Public Sub Main() Dim bb As Byte[] = [&FF, &FF, &FF] Print ((bb[0] Or ((bb[1] * CInt(2 ^ 8)))) Or ((bb[1] * CInt(2 ^ 16)))) End
oppure:
Public Sub Main() Dim q As Byte Dim bb As Byte[] = [&FF, &FF, &FF] Dim ris As Integer Do ris = (ris * CInt(2 ^ 8)) Or bb[q] Inc q Loop Until q = 3 Print ris End
Caso di lettura dei dati da un file
Nel caso di lettura da un file dei suoi dati memorizzati in Big-Endian possiamo anche qui adottare almeno due modalità.
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 = Val("&" & CStr(Pointer@(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 Return 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.