Convert from BitArray to Byte

后端 未结 9 1583
再見小時候
再見小時候 2020-11-29 08:03

I have a BitArray with the length of 8, and I need a function to convert it to a byte. How to do it?

Specifically, I need a correct function of Co

相关标签:
9条回答
  • 2020-11-29 08:31

    A poor man's solution:

    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;
    }
    
    0 讨论(0)
  • 2020-11-29 08:35

    In addition to @JonSkeet's answer you can use an Extension Method as below:

    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];
    }
    

    And use like:

    BitArray foo = new BitArray(new bool[]
    {
        false, false, false, false,false, false, false, true
    });
    
    foo.ToByte();
    
    0 讨论(0)
  • 2020-11-29 08:38

    This should do the trick. However the previous answer is quite likely the better option.

        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;
        }
    

    In the example you posted the resulting byte will be 0x80. In other words the first value in the BitArray coresponds to the first bit in the returned byte.

    0 讨论(0)
  • 2020-11-29 08:40

    A bit late post, but this works for me:

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

    Works with:

    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
    

    .

    0 讨论(0)
  • 2020-11-29 08:40
    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;
    }
    

    Cheers!

    0 讨论(0)
  • 2020-11-29 08:40

    Little endian byte array converter : First bit (indexed with "0") in the BitArray assumed to represents least significant bit (rightmost bit in the bit-octet) which interpreted as "zero" or "one" as binary.

     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
    
    0 讨论(0)
提交回复
热议问题