Как объявить и установить значение для битовой переменной в C #? - PullRequest
1 голос
/ 27 июля 2011

Я создаю сервер потокового видео в Windows Media Http Streaming Protocol (WMSP) с C #.Я прочитал спецификацию WMSP.В заголовке фрейма пакетов как $ H $ D ... имеет 2 поля:

B (1 бит): 1-битный флаг.Этот флаг ДОЛЖЕН быть установлен в 1, если следующий пакет будет отправлен сразу после отправки этого пакета.В этом контексте «немедленно» означает, что сервер намеренно не вводит задержку (например, задержку стимуляции) между передачей двух пакетов.Во всех других случаях флаг ДОЛЖЕН быть 0. <56>

Кадр (7 бит): 7-битное поле.Это поле ДОЛЖНО иметь значение 0x24.(Если поля B и Frame обрабатываются как один байт, значение этого байта будет 0x24, если поле B равно 0, и 0xA4, если поле B равно 1.)

Тип данных этого 2Поле бит, когда наименьший тип данных в C # является байтом.Итак, как объявить и установить значение для этого 2 поля?

Ответы [ 4 ]

3 голосов
/ 27 июля 2011

Вы можете использовать некоторую технику манипуляции битами в стиле C:

byte data = 0;
data |= (0x1 << 7) & 0xFF; // set the 8th bit of data
data |= 0x24;
Console.WriteLine(data.ToString("x")); // outputs 'a4'

Но так как для них есть только два случая: 0xA4, 0x24. Возможно, было бы неплохо использовать эти константы напрямую.

1 голос
/ 27 июля 2011

Просто эффективно присваивает значения обоим полям одновременно (поскольку вместе они образуют один байт для отправки):

byte headerByte = (sendImmediately) ? 0xA4 : 0x24;

Нет необходимости обрабатывать их отдельно или выполнять побитовые вычисления, поскольку вы знаете, что возможны только два значения.

0 голосов
/ 27 июля 2011

Вы можете объявить байт, а затем установить биты в байте.Старший бит байта будет вашим полем 1, а младшие 7 бит байта будут вашим полем 2.

Если вы хотите увидеть некоторые операции с битами в C #, вы можете посмотреть этот ТАК вопрос .Однако, похоже, что спецификация уже дает вам значения для установки байта, 0x24 и 0xA4, так что вы можете использовать их напрямую.

0 голосов
/ 27 июля 2011

Используйте побитовые операции, чтобы включить или выключить их, вот или они будут включены на основе троичной оценки логического значения firstBitShouldBeSet.

yourFrameByte = firstBitShouldBeSet ? yourFrameByte | 0x80 : yourFrameByte;
...