массив байтов как битовое поле в С#?

Есть ли встроенный класс или что-то в .NET, которое позволило бы мне обрабатывать массив байтов как большое битовое поле?


person Anon    schedule 21.01.2011    source источник


Ответы (1)


Взгляните на класс BitArray.

Вот пример, объясняющий, что происходит при использовании массива байтов:

byte[] myBytes = new byte[5] { 1, 2, 3, 4, 5 };
BitArray myBA3 = new BitArray( myBytes );

Console.WriteLine( "myBA3" );
Console.WriteLine( "   Count:    {0}", myBA3.Count );
Console.WriteLine( "   Length:   {0}", myBA3.Length );
Console.WriteLine( "   Values:" );
PrintValues( myBA3, 8 );

public static void PrintValues( IEnumerable myList, int myWidth )
{
   int i = myWidth;
   foreach ( Object obj in myList )
   {
      if ( i <= 0 )
      {
         i = myWidth;
         Console.WriteLine();
      }
      i--;
      Console.Write( "{0,8}", obj );
   }
   Console.WriteLine();
}

Этот код производит следующий вывод.

 myBA3
    Count:    40
    Length:   40
    Values:
     Bit0   Bit1    Bit2    Bit3    Bit4    Bit5    Bit6    Bit7
     True   False   False   False   False   False   False   False
     Bit8   Bit9    Bit10   Bit11   Bit12   Bit13   Bit14   Bit15 ... and so on
    False    True   False   False   False   False   False   False
     True    True   False   False   False   False   False   False
    False   False    True   False   False   False   False   False
     True   False    True   False   False   False   False   False
person SwDevMan81    schedule 21.01.2011
comment
Да, я пытался его использовать, но, похоже, внутри он делает какие-то причудливые вещи, как будто он переворачивает порядок следования байтов или что-то в этом роде... - person Anon; 21.01.2011
comment
@Anon. Вы можете опубликовать еще один вопрос о своих проблемах, используя класс BitArray, включая текущий тест и неожиданные результаты. - person SwDevMan81; 21.01.2011
comment
@Anon: я думаю, что BitArray использует массив int[] внутри, но я не уверен, как вы узнаете или позаботитесь о том, какой порядок следования байтов он использует. Конечно, с семантической точки зрения это просто массив bool. - person LukeH; 21.01.2011
comment
‹code›Console.WriteLine(new BitArray(new byte[] { 1 }).Get(0));‹/code› Печатает True, указывая (?), что он сохраняет байт в формате big-endian... - person Anon; 21.01.2011
comment
Вы сбиты с толку тем, что он делает. Это говорит о том, что создайте массив байтов, первое значение байта которого равно 1. BitArray берет этот байт и говорит, что значение 1 означает, что нулевой бит установлен (истина). Первый бит будет ложным, второй бит будет ложным... бит 7 будет ложным. Если вы хотите создать пустой массив BitArray с одним байтом, сделайте следующее: System.Diagnostics.Trace.WriteLine(new BitArray(new byte[1] { 0 }).Get(0)); - person SwDevMan81; 21.01.2011
comment
Хорошо, я ожидал, что bitArray.get(0) вернет крайний левый бит первого байта в исходном массиве байтов, а bitArray.get(bitArray.count-1) вернет крайний правый бит последнего байта, но я предполагаю, что их нумерация бит отличается от моей. Я просто сверну свой собственный класс BitField! - person Anon; 21.01.2011