Domanda

Mi chiedo quale sia il modo migliore per convertire un array di byte (lunghezza 4) in un numero intero in vb.net? Sono a conoscenza di BitConverter, ma sembra piuttosto uno spreco fare una chiamata di funzione per fare qualcosa che dovrebbe essere possibile copiando 4 byte di memoria. Sulla stessa linea, che ne dici di convertire un singolo / doppio dalla sua rappresentazione binaria in una singola / doppia variabile.

È stato utile?

Soluzione

" Copia di byte di memoria " è qualcosa per cui .NET non è particolarmente adatto (e VB.NET anche meno). Quindi, a meno che passare a C non sia un'opzione per te, una chiamata di funzione è praticamente inevitabile per questo.

BitConverter è una funzione ben studiata e testata. Certo, puoi evitarlo facendo qualcosa del tipo (in C #):

myInt = (*pbyte) | (*(pbyte + 1) << 8)  | (*(pbyte + 2) << 16) | (*(pbyte + 3) << 24);

(che, per inciso, è esattamente ciò che BitConverter fa per te quando converte un array di byte in un intero ...).

Tuttavia, questo codice:

  • È molto, molto più difficile da leggere e comprendere rispetto all'equivalente BitConverter;
  • Non fa alcun errore controllando BitConverter per te;
  • Non distingue tra rappresentazioni little-endian e big-endian, come fa BitConverter.

In altre parole: potresti " salvare " una chiamata di funzione, ma alla fine starai molto peggio (anche supponendo che tu non presenti alcun bug). In generale, .NET Framework è molto, molto ben progettato e non dovresti pensarci due volte sull'utilizzo della sua funzionalità, a meno che tu non incontri problemi reali (di prestazione) con esso.

Altri suggerimenti

  

Sono a conoscenza di BitConverter, ma lo è   sembra piuttosto uno spreco per fare un   chiamata di funzione per fare qualcosa che   dovrebbe poter essere fatto copiando 4   byte di memoria.

Mentre considero la situazione come " sembra piuttosto uno spreco tentare di scrivere a mano un modo efficace per farlo quando c'è già una chiamata di metodo che fa esattamente quello che voglio. "

A meno che tu non sia assolutamente convinto di avere un collo di bottiglia nelle prestazioni in questo esatto pezzo di codice, usa la funzionalità fornita dal framework.

mdb è esattamente corretto, ma qui c'è un po 'di codice per convertire un array di byte vb in un intero piccolo endian ... (nel caso in cui si desideri scrivere la propria classe di bitconverter)

'dove bits () è la tua matrice di byte di lunghezza 4

Dim i as Integer 

i = (((bits(0) Or (bits(1) << 8)) Or (bits(2) << &H10)) Or (bits(3) << &H18))

Puoi bloccare il byte di copia [] in int [] usando la classe System.Buffer.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top