Ottenere un numero dalla sua memorizzazione in formato Big-Endian

Da Gambas-it.org - Wikipedia.

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 alcune 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


oppure:

Public Sub Main()
 
 Dim bb As Byte[] = [&01, &02, &03, &04]
 Dim i As Integer
 
  i = (bb[3] Or ((bb[2] * CInt(2 ^ 8)))) Or (bb[1] * CInt(2 ^ 16)) Or (bb[0] * CInt(2 ^ 24))
   
  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 = Shl(j, 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.