Java 如何设置未在字节边界上划分的位值
我有一个2字节的头字段,其中前四位是数据包类型,其他12位是长度。但我不知道如何存储和检索这些值Java 如何设置未在字节边界上划分的位值,java,c++,bit-manipulation,Java,C++,Bit Manipulation,我有一个2字节的头字段,其中前四位是数据包类型,其他12位是长度。但我不知道如何存储和检索这些值 我用C++ C++做客户端和java的服务器。客户端必须设置该值,服务器必须检索该值 谢谢存储 unsigned short get_header(unsigned char type, unsigned short length) { return (static_cast<unsigned short>(type) << 12) | length; } 检索
我用C++ C++做客户端和java的服务器。客户端必须设置该值,服务器必须检索该值
谢谢存储
unsigned short get_header(unsigned char type, unsigned short length)
{
return (static_cast<unsigned short>(type) << 12) | length;
}
检索(从无符号字符[2])
存储
unsigned short get_header(unsigned char type, unsigned short length)
{
return (static_cast<unsigned short>(type) << 12) | length;
}
检索(从无符号字符[2])
必须使用数字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;
uint16\u t header=(键入必须使用数字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;
uint16\u t header=(至少在c/c++大小上键入,您可以简单地使用以下结构:
我不知道你是否可以用java来做这件事
struct Header{
unsigned short
type: 4
length: 12
;
};
注意,这些可能需要切换
此外,您可能会遇到endian问题,endian取决于不同的处理器类型(我所知道的所有amd和intel处理器都是相同的,我所知道的唯一不同的是PowerPC处理器,我认为最值得注意的是在PS3和xbox 360中使用)根据c/c++的大小,您可以简单地使用以下结构:
我不知道你是否可以用java来做这件事
struct Header{
unsigned short
type: 4
length: 12
;
};
注意,这些可能需要切换
此外,您可能会遇到endian问题,endian取决于不同的处理器类型(我所知道的所有amd和intel处理器都是相同的,我所知道的唯一不同的是PowerPC处理器,我认为它们在PS3和xbox 360中使用得最多)我会使用未签名的短字符来避免符号扩展出现问题。您可能需要使用((字节[0]&0x0f))+ 1,但是请记住,如果客户端和服务器可以运行在不同的Endiad硬件上,那么对于字节顺序非常小心,因为位掩蔽可以在每个端部上除去不同的位。我的印象是,在C++中隐藏了DeNANNIN。除了当向不同大小的类型抛出指针时,隐藏性是隐藏的。例如,UNSI。gned short x;unsigned char*px=(unsigned char*)&x;在小端机上,px[0]将是位7到0和px[1]将是第15位到第8位,其中0是lsb。我认为您的示例很好,但在编写\*get 2 header bytes*\的代码时,您可能需要担心endianness。我将使用无符号的short来避免符号扩展的问题。您可能需要使用((bytes[0]&0x0f)+ 1,但是请记住,如果客户端和服务器可以运行在不同的Endiad硬件上,那么对于字节顺序非常小心,因为位掩蔽可以在每个端部上除去不同的位。我的印象是,在C++中隐藏了DeNANNIN。除了当向不同大小的类型抛出指针时,隐藏性是隐藏的。例如,UNSI。gned short x;unsigned char*px=(unsigned char*)&x;在一个小的endian机器上,px[0]将是第7位到第0位,px[1]将是第15位到第8位,其中0是lsb。我认为您的示例很好,但在编写\*get 2头字节的代码时,您可能需要担心endianness*\