2012-09-26 32 views
7

Estoy buscando un método que me permita obtener una gama de bits. Por ejemplo, si tengo los datos binariosLeer el rango de bits de la matriz de bytes

0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 (2 bytes)

puede ser que necesite para obtener los datos de bits rango de 3 a 9. En otras palabras, estaría interesado en:

así que en breve me gustaría construir el método:

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

    // implementation 
} 

de modo que si paso los datos new byte[]{91,215}, 3, 9 I conseguirá byte[]{122} (nota byte 91 y 215 = 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 y byte 122 = 1 1 1 1 0 1 0 mismos datos binarios como el ejemplo.

Sería bueno si pudiera utilizar el operador << en matrices de bytes como hacer algo como:

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

Si usted está interesado en saber por qué necesito esta funcionalidad:

I estoy creando un proyecto en una pizarra y a menudo necesito leer y escribir valores en la memoria. El cdf, sfr o ddf (referido como archivo de definición de chip) contiene información sobre un chip en particular. Ese archivo puede verse como:

;  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 

Desde que estoy leyendo un montón de variables (a veces 80 veces por segundo) Me gustaría tener un algoritmo eficiente. Supongo que mi enfoque sería que si el tamaño de bytes es 8 entonces crearé un largo a partir de esos 8 bytes y luego utilizaré los operadores << y >> para obtener lo que necesito. si el bytesize es 4 entonces crearé un int y usaré los operadores << y >>, pero ¿cómo lo haré si necesito leer 16 bytes? Supongo que mi pregunta debería ser cómo implementar los operadores << y >> en tipos de estructura personalizados.

+0

80 veces por segundo? Esa es la misma velocidad que un juego 3D dibuja marcos en la pantalla. No necesitas un algoritmo muy eficiente. –

Respuesta

5

Necesita la clase BitArray de System.Collections.

+0

Eso es exactamente lo que necesito pero estoy usando .net 4.0 ... –

+0

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

3

Parece que podría ayudar a un "flujo de bits". Hay una implementación de tal concepto here. Eche un vistazo, tal vez se ajuste a sus necesidades.

+0

Tenga cuidado con ese artículo/implementación. Las operaciones de lectura/escritura de 64 bits no decodifican/codifican los datos correctamente. Y no parece que (el texto o el código) se haya actualizado en más de 7 años. – kornman00

2

La clase BigInteger en .NET 4+ toma un Byte[] en su constructor y tiene operadores de desplazamiento a la izquierda y a la derecha.

Cuestiones relacionadas