我有一个2字节的头字段,其中头四位是数据包类型,其他12位是长度。但我不知道如何存储这个值并检索它们。如何设置未在字节边界上划分的位值
我使用ms C++作为client和java for server。客户端必须设置这个值,服务器必须检索它。
由于
我有一个2字节的头字段,其中头四位是数据包类型,其他12位是长度。但我不知道如何存储这个值并检索它们。如何设置未在字节边界上划分的位值
我使用ms C++作为client和java for server。客户端必须设置这个值,服务器必须检索它。
由于
存储
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];
您必须使用数字“与”运算并右移才能提取值。
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++,代码应该是相同的,除了类型关键字。
,你可以简单地使用这样的结构: 不知道你是否可以在Java寿做到这一点...
struct Header{
unsigned short
type: 4
length: 12
;
};
注意到,那些可能需要进行切换大约
另外,你可能有endian问题,endian从处理器类型依赖于处理器类型(我知道所有amd和intel处理器都是一样的,我所知道的唯一不同的是PowerPC的我认为,最常用的PS3和Xbox 360)
我会使用未签名的short来避免签名扩展带来的问题。 – 2010-03-15 20:47:54
好点,现在会改变。 ((字节[0]&0x0f)<< 8)| – 2010-03-15 20:48:27
您可能想要使用((字节[0]&0x0f)字节[1] :) – rsp 2010-03-15 20:53:52