Java整数转换为仅2字节数组缺少额外的00

Java整数转换为仅2字节数组缺少额外的00,java,arrays,byte,Java,Arrays,Byte,我有一个数据流,是我第一次使用这个方法读取的 int messageSerialNumber = r.readUnsignedShort(); 接下来,我将其转换为 byte[] byteMessageSerialNumber = new byte[2]; byteMessageSerialNumber[0] = (byte) messageSerialNumber; byteMessageSerialNumber[1] = (byte) (messageSerialNumber &g

我有一个数据流,是我第一次使用这个方法读取的

int messageSerialNumber = r.readUnsignedShort();    
接下来,我将其转换为

byte[] byteMessageSerialNumber = new byte[2];
byteMessageSerialNumber[0] = (byte) messageSerialNumber;
byteMessageSerialNumber[1] = (byte) (messageSerialNumber >>> 8);
接下来,我构建一个更大的缓冲区数组,并向其中添加其他数据

ByteBuffer bufReply = ByteBuffer.allocate(10);
bufReply.put(replyMessageID);
bufReply.put(byteMessageSerialNumber);
byte[] fullMessageReply=bufReply.array();
我想要的是
byteMessageSerialNumber
有2个字节,所以现在的情况是它没有额外的
00

所以它变成了

05 01 00 27 36 81 82 01 2C
应该是

05 01 00 27 36 81 82 01 00 2C

解决办法很简单。像这样交换:

byteMessageSerialNumber[0] = (byte) (messageSerialNumber >>> 8);    
byteMessageSerialNumber[1] = (byte) messageSerialNumber;

第一个字节应该是
messageSerialNumber
的第一个最高有效部分,第二个字节应该是
messageSerialNumber
的最后一个最低有效部分

解决方案很简单。像这样交换:

byteMessageSerialNumber[0] = (byte) (messageSerialNumber >>> 8);    
byteMessageSerialNumber[1] = (byte) messageSerialNumber;


第一个字节应该是
messageSerialNumber
的第一个最高有效部分,第二个字节应该是
messageSerialNumber
的最后一个最低有效部分

int messageSerialNumber
的哪个值应该生成
05 01 00 27 36 81 82 01 00 2C
?(因此我们更容易测试)messageSerialNumber的整数值是44,十六进制是2C,所以您希望最后一个数组中的
byteMessageSerialNumber
只取一个字节(如果它适合于该数组)?不,我希望它是两个字节,例如,当我发送到bufReply.put(byteMessageSerialNumber)时,2C是00 2C;请包括用于生成此序列化的实际代码和输出。
int messageSerialNumber
的哪个值应生成
05 01 00 27 36 81 82 01 00 2C
?(因此我们更容易测试)messageSerialNumber的整数值是44,十六进制是2C,所以您希望最后一个数组中的
byteMessageSerialNumber
只取一个字节(如果它适合于该数组)?不,我希望它是两个字节,例如,当我发送到bufReply.put(byteMessageSerialNumber)时,2C是00 2C;请包括用于生成此序列化和输出的实际代码。我不明白你指的是左部分和右部分。你能描述一下吗?我注意到,例如,如果我的十六进制值是59,字节变成了00 89,它变成了整数。当你做>>>8时,你移动了8个位置。对于59,这些位置都是=0。尝试使用更高的数字,例如47702(1011101001010110)。然后得到186或186-256=-70作为字节(10111010或186-256=-70作为字节)。这不是一个很好的解释,但是有很好的教程。无论如何,应该清楚的是>>>8应该在第一个字节(字节[0])中完成。不太清楚的意思是您对字节进行移位或提取?当您对字节强制转换整数时,值将被截断。因此,字节将仅使用8个最右边的二进制位置构建。因此,对于47702/1011101001010110,byteMessageSerialNumber[1]从01010110获取其值。当您执行>>>8操作时,您会移动位置。结果将是1011101001010110变为10111010。所以byteMessageSerialNumber[0]从10111010得到它的值。我不明白你指的是左半部分和右半部分。你能描述一下吗?我注意到,例如,如果我的十六进制值是59,字节变成了00 89,它变成了整数。当你做>>>8时,你移动了8个位置。对于59,这些位置都是=0。尝试使用更高的数字,例如47702(1011101001010110)。然后得到186或186-256=-70作为字节(10111010或186-256=-70作为字节)。这不是一个很好的解释,但是有很好的教程。无论如何,应该清楚的是>>>8应该在第一个字节(字节[0])中完成。不太清楚的意思是您对字节进行移位或提取?当您对字节强制转换整数时,值将被截断。因此,字节将仅使用8个最右边的二进制位置构建。因此,对于47702/1011101001010110,byteMessageSerialNumber[1]从01010110获取其值。当您执行>>>8操作时,您会移动位置。结果将是1011101001010110变为10111010。因此,byteMessageSerialNumber[0]从10111010获取其值。