Есть ли встроенный класс или что-то в .NET, которое позволило бы мне обрабатывать массив байтов как большое битовое поле?
массив байтов как битовое поле в С#?
Ответы (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
Да, я пытался его использовать, но, похоже, внутри он делает какие-то причудливые вещи, как будто он переворачивает порядок следования байтов или что-то в этом роде...
- person Anon; 21.01.2011
@Anon. Вы можете опубликовать еще один вопрос о своих проблемах, используя класс BitArray, включая текущий тест и неожиданные результаты.
- person SwDevMan81; 21.01.2011
@Anon: я думаю, что
BitArray
использует массив int[]
внутри, но я не уверен, как вы узнаете или позаботитесь о том, какой порядок следования байтов он использует. Конечно, с семантической точки зрения это просто массив bool
.
- person LukeH; 21.01.2011
‹code›Console.WriteLine(new BitArray(new byte[] { 1 }).Get(0));‹/code› Печатает True, указывая (?), что он сохраняет байт в формате big-endian...
- person Anon; 21.01.2011
Вы сбиты с толку тем, что он делает. Это говорит о том, что создайте массив байтов, первое значение байта которого равно 1. BitArray берет этот байт и говорит, что значение 1 означает, что нулевой бит установлен (истина). Первый бит будет ложным, второй бит будет ложным... бит 7 будет ложным. Если вы хотите создать пустой массив BitArray с одним байтом, сделайте следующее:
System.Diagnostics.Trace.WriteLine(new BitArray(new byte[1] { 0 }).Get(0));
- person SwDevMan81; 21.01.2011
Хорошо, я ожидал, что bitArray.get(0) вернет крайний левый бит первого байта в исходном массиве байтов, а bitArray.get(bitArray.count-1) вернет крайний правый бит последнего байта, но я предполагаю, что их нумерация бит отличается от моей. Я просто сверну свой собственный класс BitField!
- person Anon; 21.01.2011