2010-03-15 91 views
0

我有一个2字节的头字段,其中头四位是数据包类型,其他12位是长度。但我不知道如何存储这个值并检索它们。如何设置未在字节边界上划分的位值

我使用ms C++作为client和java for server。客户端必须设置这个值,服务器必须检索它。

由于

回答

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; 

检索(来自无符号字符[2])

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

我会使用未签名的short来避免签名扩展带来的问题。 – 2010-03-15 20:47:54

+0

好点,现在会改变。 ((字节[0]&0x0f)<< 8)| – 2010-03-15 20:48:27

+2

您可能想要使用((字节[0]&0x0f)字节[1] :) – rsp 2010-03-15 20:53:52

1

您必须使用数字“与”运算并右移才能提取值。

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

在C/C++大小ATLEAST
0

,你可以简单地使用这样的结构: 不知道你是否可以在Java寿做到这一点...

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

注意到,那些可能需要进行切换大约

另外,你可能有endian问题,endian从处理器类型依赖于处理器类型(我知道所有amd和intel处理器都是一样的,我所知道的唯一不同的是PowerPC的我认为,最常用的PS3和Xbox 360)