Как установить битовые значения, которые не разделены на границе байта - PullRequest
0 голосов
/ 15 марта 2010

У меня есть поле заголовка в 2 байта, где первые четыре бита относятся к типу пакета, а остальные 12 бит - к длине. но я не знаю, как сохранить эти значения и получить их.

Я использую MS C ++ для клиента и Java для сервера. Именно клиент должен установить эти значения, а сервер должен получить его.

Спасибо

Ответы [ 3 ]

4 голосов
/ 15 марта 2010

Хранение

unsigned short get_header(unsigned char type, unsigned short length)
{
  return (static_cast<unsigned short>(type) << 12) | length;    
}

Извлечение (из неподписанного короткого)

unsigned short header = /* get 2 header bytes */
unsigned char type = header >> 12;
unsigned short length = header & 0xFFF;

Извлечение (из неподписанного символа [2])

unsigned char bytes[2] = /* get 2 header bytes */
unsigned char type = bytes[0] >> 4;
unsigned short length = bytes[0] & 0xF | bytes[1];
1 голос
/ 15 марта 2010

Вы должны использовать числовую операцию И и сдвиг вправо для извлечения значений.

Your header:     TTTTLLLLLLLLLLLL
Mask for type:   1111000000000000 = 0xF000
Mask for length: 0000111111111111 = 0x0FFF

Извлечение:

// Just an example, this is 0001001000110100 in binary
uint16_t exampleHeader = 0x1234;

// Mask out the length and shift type to the right to get 0001 (binary)
uint8_t type = (exampleHeader & 0xF000) >> 12;

// Same here but no shift needed, returns 001000110100 (binary)
uint16_t length = exampleHeader & 0x0FFF;

Сборка заголовка:

uint16_t header = (type << 12) | length;

Вы можете заменить целочисленные типы (uintXX_t) на соответствующий тип вашего языка, например unsigned long. Код должен быть одинаковым для Java и C ++, за исключением ключевых слов типа.

0 голосов
/ 16 марта 2010

по крайней мере с размером c / c ++, вы можете просто использовать эту структуру: не знаю, если вы можете сделать это в Java, хотя ...

struct Header{
   unsigned short
         type: 4
         length: 12
         ;
};  

обратите внимание, что, возможно, их нужно переключить вокруг

также у вас могут быть проблемы с порядком байтов, порядок байтов зависит от типа процессора и типа процессора (все известные мне процессоры amd и intel одинаковые, единственные, которые мне известны, это PowerPC, я думаю, большинство заметно используется в PS3 и xbox 360)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...