我有一个2字节的标头字段,其中前四位是数据包类型,其他12位是长度。但我不知道如何存储这些值并检索它们。
我使用ms c ++用于客户端,java用于服务器。客户端必须设置此值,服务器必须检索它。
由于
答案 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)
struct Header{
unsigned short
type: 4
length: 12
;
};
请注意,那些可能需要切换
另外,你可能有端序问题,端点依赖于处理器类型到处理器类型(我知道的所有amd和intel处理器是相同的,我所知道的唯一不同的是我认为的PowerPC,大多数值得注意的是在PS3和xbox 360中使用