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:
  
  
Facendo l'esempio con una lettura dei dati in ''Big-Endian'' da un file:
+
===Caso di lettura dei dati da un file===
  '''Private''' Function Legge_Big_Endian(fl As File, b As Byte) As Integer
+
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 c As Byte  
+
  Dim fl As File
Dim j As Integer
+
  Dim bb As Byte[]
 +
  Dim i As Integer
 
    
 
    
  Do
+
  fl = Open "<FONT Color=gray>''/percorso/del/file''</font>" For Read
    Read #fl, c
+
 
     j = (j * CInt(2 ^ 8)) Or c
+
<FONT Color=gray>' ''Legge ad esempio 32 bit (4 byte):''</font>
    Dec b
+
  With bb = New Byte[4]
   Loop Until b = 0
+
    .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
 
    
 
    
  Return j
+
  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.