Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何设置未在字节边界上划分的位值_Java_C++_Bit Manipulation - Fatal编程技术网

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

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; } 检索

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

我用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*\