Convertir de BitArray a Byte

Tengo un BitArray con una longitud de 8, y necesito una función para convertirlo en un byte . ¿Cómo hacerlo?

Específicamente, necesito una función correcta de ConvertToByte :

 BitArray bit = new BitArray(new bool[] { false, false, false, false, false, false, false, true }); //How to write ConvertToByte byte myByte = ConvertToByte(bit); var recoveredBit = new BitArray(new[] { myByte }); Assert.AreEqual(bit, recoveredBit); 

Esto debería funcionar:

 byte ConvertToByte(BitArray bits) { if (bits.Count != 8) { throw new ArgumentException("bits"); } byte[] bytes = new byte[1]; bits.CopyTo(bytes, 0); return bytes[0]; } 

Un poco tarde, pero esto funciona para mí:

 public static byte[] BitArrayToByteArray(BitArray bits) { byte[] ret = new byte[(bits.Length - 1) / 8 + 1]; bits.CopyTo(ret, 0); return ret; } 

Funciona con:

 string text = "Test"; byte[] bytes = System.Text.Encoding.ASCII.GetBytes(text); BitArray bits = new BitArray(bytes); bytes[] bytesBack = BitArrayToByteArray(bits); string textBack = System.Text.Encoding.ASCII.GetString(bytesBack); // bytes == bytesBack // text = textBack 

.

La solución de un pobre hombre

 protected byte ConvertToByte(BitArray bits) { if (bits.Count != 8) { throw new ArgumentException("illegal number of bits"); } byte b = 0; if (bits.Get(7)) b++; if (bits.Get(6)) b += 2; if (bits.Get(5)) b += 4; if (bits.Get(4)) b += 8; if (bits.Get(3)) b += 16; if (bits.Get(2)) b += 32; if (bits.Get(1)) b += 64; if (bits.Get(0)) b += 128; return b; } 

Esto debería funcionar. Sin embargo, la respuesta anterior es probablemente la mejor opción.

  public byte ConvertToByte(BitArray bits) { if (bits.Count > 8) throw new ArgumentException("ConvertToByte can only work with a BitArray containing a maximum of 8 values"); byte result = 0; for (byte i = 0; i < bits.Count; i++) { if (bits[i]) result |= (byte)(1 << i); } return result; } 

En el ejemplo que publicó, el byte resultante será 0x80. En otras palabras, el primer valor en el BitArray corresponde al primer bit en el byte devuelto.

Ese debería ser el último. Funciona con cualquier longitud de matriz.

 private List BoolList2ByteList(List values) { List ret = new List(); int count = 0; byte currentByte = 0; foreach (bool b in values) { if (b) currentByte |= (byte)(1 << count); count++; if (count == 7) { ret.Add(currentByte); currentByte = 0; count = 0; }; } if (count < 7) ret.Add(currentByte); return ret; } 

Además de la respuesta de @JonSkeet puedes usar el Método genérico como golpe:

 public static byte ToByte(this BitArray bits) { if (bits.Count != 8) { throw new ArgumentException("bits"); } byte[] bytes = new byte[1]; bits.CopyTo(bytes, 0); return bytes[0]; } 

Y use como:

 BitArray foo = new BitArray(new bool[] { false, false, false, false,false, false, false, true }); foo.ToByte(); 

Desafortunadamente, la clase BitArray se implementa parcialmente en .Net Core class (UWP). Por ejemplo, la clase BitArray no puede llamar a los métodos CopyTo () y Count (). Escribí esta extensión para llenar el vacío:

 public static IEnumerable ToBytes(this BitArray bits, bool MSB = false) { int bitCount = 7; int outByte = 0; foreach (bool bitValue in bits) { if (bitValue) outByte |= MSB ? 1 << bitCount : 1 << (7 - bitCount); if (bitCount == 0) { yield return (byte) outByte; bitCount = 8; outByte = 0; } bitCount--; } // Last partially decoded byte if (bitCount < 7) yield return (byte) outByte; } } 

El método decodifica el BitArray a una matriz de bytes utilizando la lógica LSB (Byte menos significativo). Esta es la misma lógica utilizada por la clase BitArray. Llamar al método con el parámetro MSB establecido en verdadero producirá una secuencia de bytes decodificados MSB. En este caso, recuerde que tal vez también necesite invertir la colección final de bytes de salida.

 byte GetByte(BitArray input) { int len = input.Length; if (len > 8) len = 8; int output = 0; for (int i = 0; i < len; i++) if (input.Get(i)) output += (1 << (len - 1 - i)); //this part depends on your system (Big/Little) //output += (1 << i); //depends on system return (byte)output; } 

¡Aclamaciones!

Conversor de matriz de bytes little endian: primer bit (indexado con “0”) en el BitArray supone que representa el bit menos significativo (bit más a la derecha en el bit-octeto) que interpretó como “cero” o “uno” como binario.

  public static class BitArrayExtender { public static byte[] ToByteArray( this BitArray bits ) { const int BYTE = 8; int length = ( bits.Count / BYTE ) + ( (bits.Count % BYTE == 0) ? 0 : 1 ); var bytes = new byte[ length ]; for ( int i = 0; i < bits.Length; i++ ) { int bitIndex = i % BYTE; int byteIndex = i / BYTE; int mask = (bits[ i ] ? 1 : 0) << bitIndex; bytes[ byteIndex ] |= (byte)mask; }//for return bytes; }//ToByteArray }//class