Differenze tra le versioni di "Sapere l'ordine dei byte utilizzato dal sistema per salvare i dati"

Da Gambas-it.org - Wikipedia.
Riga 16: Riga 16:
  
  
===Leggendo da un flusso di dati===
+
===Usando e dereferenziando un Puntatore===
Quest'altro modo prevede che si scriva in un flusso di dati (''File'' o ''Stream'') il valore 1 contenuto in una variabile di tipo ''Short'', e che pertanto in esadecimale è rappresentato da due byte: ''00 01''. Da detto flusso di dati si leggerà, quindi, il primo byte salvato.
+
Quest'altro modo prevede che si ottenga un ''Puntatore'' da una variabile di tipo ''Short'', che sia stata inizializzata con il valore numerico 1. Va fatto notare che tale valore di tipo ''Short'' è rappresentato in esadecimale da due byte: ''00 01''.
 +
<BR>Si provvederà a dereferenziare il predetto ''Puntatore'' con l'apposita funzione "Byte@()", al fine di leggere soltanto il primo byte-dato del valore numerico "1".
 
<BR>Se il valore restituito è uguale a zero, allora l'ordine dei byte in cui vengono salvati i dati, sarà del tipo ''Big-Endian''; se il valore è uguale a 1 allora l'ordine dei byte sarà di tipo ''Little-Endian''.
 
<BR>Se il valore restituito è uguale a zero, allora l'ordine dei byte in cui vengono salvati i dati, sarà del tipo ''Big-Endian''; se il valore è uguale a 1 allora l'ordine dei byte sarà di tipo ''Little-Endian''.
  
Riga 24: Riga 25:
 
   
 
   
 
   Dim p As Pointer
 
   Dim p As Pointer
   Dim c As Short = 1
+
   Dim c As Short = '''1'''
  Dim st As Stream
 
  Dim b As Byte
 
 
   
 
   
 
   p = VarPtr(c)
 
   p = VarPtr(c)
  st = Memory p For Read
 
  Read #st, b
 
 
   
 
   
   If b = 1 Then
+
   If Byte@(p) == 1 Then
 
     Print "Lettura Little-Endian"
 
     Print "Lettura Little-Endian"
 
   Else
 
   Else
 
     Print "Lettura Big-Endian"
 
     Print "Lettura Big-Endian"
 
   Endif
 
   Endif
 
 
  st.Close
 
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione delle 15:49, 11 set 2022

Per sapere se il proprio sistema adotta la modalità Big-Endian o la modalità Little-Endian per salvare i dati in un file, è possibile utilizzare almeno due modi:

Uso della proprietà System.ByteOrder

Gambas mette a disposizione la specifica proprietà .ByteOrder della Classe System per conoscere l'ordine dei byte.

Esempio:

Public Sub Main()

 If System.ByteOrder == 0 then
   Print "Lettura Little-Endian"
 Else
   Print "Lettura Big-Endian"
 Endif

End


Usando e dereferenziando un Puntatore

Quest'altro modo prevede che si ottenga un Puntatore da una variabile di tipo Short, che sia stata inizializzata con il valore numerico 1. Va fatto notare che tale valore di tipo Short è rappresentato in esadecimale da due byte: 00 01.
Si provvederà a dereferenziare il predetto Puntatore con l'apposita funzione "Byte@()", al fine di leggere soltanto il primo byte-dato del valore numerico "1".
Se il valore restituito è uguale a zero, allora l'ordine dei byte in cui vengono salvati i dati, sarà del tipo Big-Endian; se il valore è uguale a 1 allora l'ordine dei byte sarà di tipo Little-Endian.

Un possibile codice è il seguente:

Public Sub Main()

 Dim p As Pointer
 Dim c As Short = 1

 p = VarPtr(c)

 If Byte@(p) == 1 Then
   Print "Lettura Little-Endian"
 Else
   Print "Lettura Big-Endian"
 Endif

End