如何设置未在字节边界上划分的位值

时间:2010-03-15 20:34:29

标签: java c++ bit-manipulation

我有一个2字节的标头字段,其中前四位是数据包类型,其他12位是长度。但我不知道如何存储这些值并检索它们。

我使用ms c ++用于客户端,java用于服务器。客户端必须设置此值,服务器必须检索它。

由于

3 个答案:

答案 0 :(得分:4)

<强>存储

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;

检索(来自unsigned char [2])

unsigned char bytes[2] = /* get 2 header bytes */
unsigned char type = bytes[0] >> 4;
unsigned short length = bytes[0] & 0xF | bytes[1];

答案 1 :(得分:1)

您必须使用数字AND操作并右移以提取值。

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 ++的代码应该相同,但类型关键字除外。

答案 2 :(得分:0)

至少在c / c ++大小上,你可以简单地使用这个结构: 不知道你是否可以在java中做到这一点...

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

请注意,那些可能需要切换

另外,你可能有端序问题,端点依赖于处理器类型到处理器类型(我知道的所有amd和intel处理器是相同的,我所知道的唯一不同的是我认为的PowerPC,大多数值得注意的是在PS3和xbox 360中使用