2017-02-21 3 views
1

Я разрабатываю приложение, которое будет отправлять данные за RTP, но я почти никогда не работал с байтами. Сейчас я пытаюсь использовать BitArray:C# - Как мне создать байт из бит?

byte[] toSend = new byte[12]; 
BitArray b = new BitArray(new int[] { 2 }); 
b.CopyTo(toSend, 0); 

но он работает с Int32, так 2 представлена ​​как 0100..0, и это не то, что мне нужно. У меня 2 вопроса:

  1. Как я должен объединить 2|1|1|4 бит в один байт? Я думаю, что должно быть что-то, что выглядит следующим образом:

    int version = 2;//2 bits 
    int padding = 0;//1 bit 
    int extension = 0;//1 bit 
    int ccrc = 0;//4 bits 
    
    byte[] toSend = new byte[1]{version+padding+extension+ccrc}; 
    
  2. Для некоторых заголовков есть 16 бит защищены, так что мне нужно что-то вроде этого : 0000000000000000(16), но я не знаю, как создать такой переменной , и как записать 16 бит в два байта.

+0

Не забудьте проверить для байтов/добавить исключение, если система имеет неверный порядок байтов! – gismo

ответ

2

Если я правильно понял, вы пытаетесь создать байт из бит.

Почему бы не использовать функцию a, которая принимает байт, значение бита и положение для размещения бит, как описано here?

+0

Я думаю, что это отвечает на мой первый вопрос. Но как я могу хранить 16-битные и 32-битные значения? Простые Int16 или Int32? – Jamil

+0

вы можете создать массив байтов (таким образом, это не имеет значения для размера int), или пусть функция вернется долго и приведет результат к тому, что вам нужно – gismo

2

Начиная со второй точки. Как создать переменную, которая вмещает до 16 бит (2 байта), содержащие только 0 «S:

char _16bitsOfZero = '\0'; // this will have the default value of NULL character 
// which basically is 0000 0000 0000 0000 

Двигаясь дальше, чтобы создать один байт со значением из ваших 4 целых чисел:

int version = 2; // 2 bits which will be shifted to the most left 
int padding = 0; // 1 bit which will be shifted to the most left but just before version 
int extension = 0; // 1 bit which will be shifted to right before padding 
int ccrc = 0; // 4 bits that ... wont be shifted. 

// first of all this all is going to be one byte (8 bits) 
// 00 0 0 0000 <- beginning value 
byte b = 0; 
// now we want to shift our ccrc to be in the back 
// 00 0 0 ccrc <- like this 
// to put this value there we need to shift this 
b = (byte)ccrc; 
// now we want to shift extension right after ccrc value 
// remembering that ccrc is 4 bits wide : 
b |= (extension << 4); 
// now do the same with padding : 
b |= (padding << 5); // 4 because previous value was 1 bit wide 
// now the same with version : 
b |= (version << 6); 
// output from this should be : 
// 10 0 0 0000 
// which is 128 

Чтобы проверить это на самом деле 128 идти here

// to be more precise : 
// assume ccrc = 15 (0000 1111) 
// and b = 0 (0000 0000) 
// now use shift : 
b |= 
    (ccrc << 1) // will produce the output of (0001 1110) 
Смежные вопросы