2012-09-26 13 views
7

Sto cercando un metodo che mi consenta di ottenere una gamma di bit. Ad esempio se ho i dati binariIntervallo di bit di lettura dall'array di byte

0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 (2 byte)

Forse bisogno di ottenere dati da bit campo da 3 a 9. In altre parole che sarebbe interessato a:

così in breve gradirò costruire il metodo:

byte[] Read(byte[] data, int left, int right){ 

    // implementation 
} 

modo che se passo i dati new byte[]{91,215}, 3, 9 OTTERRÒ byte[]{122} (nota byte 91 e 215 = 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 e byte 122 = 1 1 1 1 0 1 0 stessi dati binari come esempio.

Sarebbe bello se potessi utilizzare l'operatore << su array di byte come fare qualcosa di simile:

byte[] myArray = new byte[] { 1, 2, 3 }; 
    var shift = myArray << 2; 

Se siete interessati a conoscere il motivo per cui ho bisogno di questa funzionalità:

I sto creando un progetto su una lavagna e spesso ho bisogno di leggere e scrivere valori nella memoria. Il cdf, sfr o ddf (definito come file di definizione del chip) contiene informazioni su un particolare chip. Questo file potrebbe essere simile:

;  Name       Zone  Address  Bytesize Displaybase Bitrange 
;  ----       ----  -------  -------- ----------- -------- 

sfr = "SPI0_CONTROL"    , "Memory", 0x40001000,  4, base=16 
sfr = "SPI0_CONTROL.SPH"   , "Memory", 0x40001000,  4, base=16, bitRange=25-25 
sfr = "SPI0_CONTROL.SPO"   , "Memory", 0x40001000,  4, base=16, bitRange=24-24 
sfr = "SPI0_CONTROL.TXRXDFCOUNT" , "Memory", 0x40001000,  4, base=16, bitRange=8-23 
sfr = "SPI0_CONTROL.INT_TXUR"  , "Memory", 0x40001000,  4, base=16, bitRange=7-7 
sfr = "SPI0_CONTROL.INT_RXOVF" , "Memory", 0x40001000,  4, base=16, bitRange=6-6 

Dal momento che sto leggendo un sacco di variabili (a volte 80 volte al secondo) mi piace avere un algoritmo efficiente. Credo che il mio approccio sarebbe che se il byte è 8 allora creerò un lungo da quegli 8 byte, quindi uso gli operatori << e >> per ottenere ciò di cui ho bisogno. se il byte se 4 allora creerò un int e userò gli operatori << e >> ma come lo farò se ho bisogno di leggere 16 byte però? Credo che la mia domanda dovrebbe essere come implementare gli operatori << e >> su tipi di strutture personalizzate.

+0

80 volte al secondo? È la stessa velocità con cui un gioco 3D disegna frame sullo schermo. Non hai bisogno di un algoritmo molto efficiente. –

risposta

5

È necessaria la classe BitArray da System.Collections.

+0

Questo è esattamente ciò di cui ho bisogno, ma sto usando .net 4.0 ... –

+0

http://msdn.microsoft.com/en-us/library/system.collections.bitarray(v=vs.100).aspx che è :) – STO

3

Sembra che tu possa aiutare un "flusso di bit". Esiste un'implementazione di tale concetto here. Dai un'occhiata, forse si adatta alle tue esigenze.

+0

Stai attento a quell'articolo/implementazione. Le operazioni di lettura/scrittura a 64 bit non decodificano/codificano i dati correttamente. E non sembra (il testo o il codice) è stato aggiornato in oltre 7 anni. – kornman00

2

La classe BigInteger in .NET 4+ richiede Byte[] nel suo costruttore e dispone di operatori di spostamento sinistro e destro.