Shift su bit

martedì 08 settembre 2009 - 18.14

Gianni77 Profilo | Junior Member

In un codice che ho scaricato ho trovato questa funzione, gli si passa un array di 4 byte e deve restituire un intero a 32 bit:
Private Function GetInt32(ByVal B As Byte()) As Int32 If B.Length < 4 Then Throw New ArgumentException("Data too short (4 bytes expected)", "B") Return B(3) << 24 Or B(2) << 16 Or B(1) << 8 Or B(0) End Function

Questa funzione ... non funziona ... mi restituisce sempre l'intero corrispondente al primo byte, ignorando gli altri....
L'ho modificata in questo modo, forse più grezzo, ma funziona:
Private Function GetInt32(ByVal B As Byte()) As Int32 If B.Length < 4 Then Throw New ArgumentException("Data too short (4 bytes expected)", "B") Return CInt((B(3) * (256 ^ 3)) + (B(2) * (256 ^ 2)) + (B(1) * 256) + B(0)) End Function

Adesso, pure se il problema me lo sono risolto.... Vorrei sapere come mai la funzione originale non va e come si adopera l'operatore <<

aiedail92 Profilo | Expert

Ciao

La funzione originale non funziona perché l'operazione di shift dei bit viene eseguita su valori di tipo Byte, la cui dimensione è, appunto, 1 byte, cioè 8 bit.

Ora, eseguendo uno shift verso sinistra con valore ad 8 bit, se il numero di posizione eccede le 7, il risultato è sempre zero perché i bit shiftati vengono persi quando superano la dimensione della variabile.

Come hai fatto tu, invece, converti esplicitamente l'espressione in un intero, cioè 4 byte, 32 bit, in modo che nessun bit venga perso.

Spero di essere stato abbastanza chiaro

Luca

Gianni77 Profilo | Junior Member

Ho capito perfettamente.
C'è un altro sistema oltre il mio per fondere insieme 4 byte in un unico intero a 32 bit, senza utilizzare operazioni algebriche ma usando solo and,or ? Non mi viene in mente nulla.

aiedail92 Profilo | Expert

Puoi usare semplicemente la funzione BitConverter.ToInt32, che prende 4 byte dall'array che passi, a partire dall'offset specificato:

Dim bytes as Byte() = { 5, 2, 15, 2 } Dim int as Integer = BitConverter.ToInt32(bytes, 0)

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5