Differenze tra le versioni di "Ottenere dai suoi singoli dati-byte un valore numerico di tipo superiore al Byte"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "Volendo estrarre un valore di dimensioni superiori al tipo ''Byte'', memorizzato in un flusso di dati o in un'area di memoria riservata o in un vettore di tipo Byte[], si potr...")
 
 
Riga 1: Riga 1:
Volendo estrarre un valore di dimensioni superiori al tipo ''Byte'', memorizzato in un flusso di dati o in un'area di memoria riservata o in un vettore di tipo Byte[], si potrà procedere come appresso indicato.
+
Volendo estrarre un valore di dimensioni superiori al tipo ''Byte'', memorizzato in un flusso di dati oppure in un'area di memoria riservata oppure in un vettore di tipo Byte[], si potrà procedere come appresso indicato.
  
 
==Se il valore può essere rappresentato da un ''Integer''==
 
==Se il valore può essere rappresentato da un ''Integer''==
Riga 5: Riga 5:
  
 
==1<SUP>a</sup> modalità==
 
==1<SUP>a</sup> modalità==
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim bb As Byte[] = [&33, &22, &11, &00]
 
   Dim bb As Byte[] = [&33, &22, &11, &00]
Riga 15: Riga 15:
 
   Print i
 
   Print i
 
      
 
      
  '''End'''
+
  End
 
e similmente con gli altri tipi di dati superiori al Byte.
 
e similmente con gli altri tipi di dati superiori al Byte.
 
  
  
 
==2<SUP>a</sup> modalità==
 
==2<SUP>a</sup> modalità==
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim i As Integer
 
   Dim i As Integer
Riga 43: Riga 42:
 
   Print i
 
   Print i
 
      
 
      
  '''End'''
+
  End
  
  
Riga 50: Riga 49:
  
 
Ad esempio si deve estrarre un valore memorizzato da 4 byte &FF &FF &FF &FF in ''Little-Endian'':
 
Ad esempio si deve estrarre un valore memorizzato da 4 byte &FF &FF &FF &FF in ''Little-Endian'':
  ''' Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim bb As Byte[] = [&FF, &FF, &FF, &FF]
 
   Dim bb As Byte[] = [&FF, &FF, &FF, &FF]
Riga 62: Riga 61:
 
   Print l, Hex(l, 8)
 
   Print l, Hex(l, 8)
 
    
 
    
  '''End'''
+
  End
  
 
Se invece il valore è memorizzato in ''Big-Endian'':
 
Se invece il valore è memorizzato in ''Big-Endian'':
  ''' Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim bb As Byte[] = [&FF, &FF, &FF, &FF]
 
   Dim bb As Byte[] = [&FF, &FF, &FF, &FF]
Riga 77: Riga 76:
 
   Print l, Hex(l, 8)
 
   Print l, Hex(l, 8)
 
    
 
    
  '''End'''
+
  End
 
 
  
  
Riga 85: Riga 83:
  
 
Se il valore, rappresentabile solo con il tipo di dati ''Long'', è memorizzato in ''Little-Endian'':
 
Se il valore, rappresentabile solo con il tipo di dati ''Long'', è memorizzato in ''Little-Endian'':
  '''Public Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim l As Long
 
   Dim l As Long
Riga 103: Riga 101:
 
   Print l, Hex(l, 8)
 
   Print l, Hex(l, 8)
 
    
 
    
  '''End'''
+
  End
  
 
Se il valore, rappresentabile solo con il tipo di dati ''Long'', è memorizzato in ''Big-Endian'':
 
Se il valore, rappresentabile solo con il tipo di dati ''Long'', è memorizzato in ''Big-Endian'':
  '''Public Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim l As Long
 
   Dim l As Long
Riga 124: Riga 122:
 
   Print l, Hex(l, 8)
 
   Print l, Hex(l, 8)
 
    
 
    
  '''End'''
+
  End

Versione attuale delle 15:05, 4 apr 2024

Volendo estrarre un valore di dimensioni superiori al tipo Byte, memorizzato in un flusso di dati oppure in un'area di memoria riservata oppure in un vettore di tipo Byte[], si potrà procedere come appresso indicato.

Se il valore può essere rappresentato da un Integer

Poniamo il caso che il valore da estrapolare sia il seguente Integer: 1122867.

1a modalità

Public Sub Main()

 Dim bb As Byte[] = [&33, &22, &11, &00]
 Dim i As Integer
 
' Dereferenziamo il "Puntatore" restituito dalla proprietà .Data del vettore: 
 i = Int@(bb.Data)
  
 Print i
   
End

e similmente con gli altri tipi di dati superiori al Byte.


2a modalità

Public Sub Main()
 
 Dim i As Integer

' Se i byte, che nel file rappresentano quel numero, sono disposti secondo l'ordine "Little-Endian", allora:
 Dim bb As Byte[] = [&33, &22, &11, &00]
 
 i = CInt(bb[3]) * 16777216     ' &01000000
 i += bb[2] * 65536             ' &010000
 i += bb[1] * 256               ' &0100
 i += bb[0]
 
' Se, invece, l'ordine dei byte è "Big-Endian", allora la sequenza degli indici dei singoli elementi del vettore sarà invertita:
 ' Dim bb As Byte[] = [&00, &11, &22, &33]
 
 ' i = CInt(bb[0]) * 16777216
 ' i += bb[1] * 65536
 ' i += bb[2] * 256
 ' i += bb[3]

  Print i
   
End


Se il valore può essere rappresentato solo da un Long

Se la grandezza del valore può essere rappresentata solo da un Long, allora si potrà procedere come segue.

Ad esempio si deve estrarre un valore memorizzato da 4 byte &FF &FF &FF &FF in Little-Endian:

Public Sub Main()
 
 Dim bb As Byte[] = [&FF, &FF, &FF, &FF]
 Dim l As Long
 
 l = CLong(bb[3]) * 16777216    ' &01000000
 l += bb[2] * 65536             ' &010000
 l += bb[1] * 256               ' &0100
 l += bb[0]
 
 Print l, Hex(l, 8)
 
End

Se invece il valore è memorizzato in Big-Endian:

Public Sub Main()
 
 Dim bb As Byte[] = [&FF, &FF, &FF, &FF]
 Dim l As Long
 
 l = CLong(bb[0]) * 16777216    ' &01000000
 l += bb[1] * 65536             ' &010000
 l += bb[2] * 256               ' &0100
 l += bb[3]
 
 Print l, Hex(l, 8)
 
End


3a modalità

Si potrà anche effettuare uno spostamento a sinistra dei bit di ciascun byte-valore letto a partire dal secondo.

Se il valore, rappresentabile solo con il tipo di dati Long, è memorizzato in Little-Endian:

Public Sub Main()
 
 Dim l As Long
 Dim bb As Byte[] = [&33, &22, &11, &FF]   ' 4279312947
 
 l = CLong(bb[0])
 l += CLong(Shl(CInt(bb[1]), 8))
 l += CLong(Shl(CInt(bb[2]), 16))
 l += CLong(Shl(CLong(bb[3]), 24))
 
' Altresì utilizzando l'operatore OR:
 ' l = CLong(bb[0])
 ' l = l Or CLong(Shl(CInt(bb[1]), 8))
 ' l = l Or CLong(Shl(CInt(bb[2]), 16))
 ' l = l Or CLong(Shl(CLong(bb[3]), 24))
 
 Print l, Hex(l, 8)
 
End

Se il valore, rappresentabile solo con il tipo di dati Long, è memorizzato in Big-Endian:

Public Sub Main()
 
 Dim l As Long
 Dim bb As Byte[] = [&FF, &11, &22, &33]   ' 4279312947
 
 l = CLong(Shl(CLong(bb[0]), 24))
 l += CLong(Shl(CInt(bb[1]), 16))
 l += CLong(Shl(CInt(bb[2]), 8))
 l += CLong(bb[3])
 
' Altresì utilizzando l'operatore OR:
 ' l = CLong(Shl(CLong(bb[0]), 24))
 ' l = l Or CLong(Shl(CInt(bb[1]), 16))
 ' l = l Or CLong(Shl(CInt(bb[2]), 8))
 ' l = l Or CLong(bb[3])
 
 Print l, Hex(l, 8)
 
End