Как уже опубликовал RyuuGan, вы должны использовать BitArrary . Вы просто помещаете данные в него, вызывая конструктор с требуемыми элементами.
byte[] myBytes = new byte[5] { 1, 2, 3, 4, 5 };
BitArray bitArray = new BitArray( myBytes );
Впоследствии у экземпляра есть несколько интересных свойств, облегчающих доступ к каждому биту. Сначала вы можете просто вызвать оператор индекса, чтобы получить или установить состояние каждого бита:
bool bit = bitArray[4];
bitArray[2] = true;
Также вы можете перечислять все биты, просто используя цикл foreach (или любой другой LINQ-материал, который вам нравится)
foreach (var bit in bitArray.Cast<bool>())
{
Console.Write(bit + " ");
}
Возвращение от битов к какому-то определенному типу (например, int) немного сложнее, но с помощью методов расширения это довольно просто:
public static class Extensions
{
public static IList<TResult> GetBitsAs<TResult>(this BitArray bits) where TResult : struct
{
return GetBitsAs<TResult>(bits, 0);
}
/// <summary>
/// Gets the bits from an BitArray as an IList combined to the given type.
/// </summary>
/// <typeparam name="TResult">The type of the result.</typeparam>
/// <param name="bits">An array of bit values, which are represented as Booleans.</param>
/// <param name="index">The zero-based index in array at which copying begins.</param>
/// <returns>An read-only IList containing all bits combined to the given type.</returns>
public static IList<TResult> GetBitsAs<TResult>(this BitArray bits, int index) where TResult : struct
{
var instance = default(TResult);
var type = instance.GetType();
int sizeOfType = Marshal.SizeOf(type);
int arraySize = (int)Math.Ceiling(((bits.Count - index) / 8.0) / sizeOfType);
var array = new TResult[arraySize];
bits.CopyTo(array, index);
return array;
}
}
Имея это в виду, вы можете просто выйти из этого с помощью одной строки кода:
IList<int> result = bitArray.GetBitsAs<int>();