端口范围从0到65536,因为它存储为16位无符号整数。
在Java中,16位的短仅上升到32,767.整数很好,但是API需要一个无符号整数,所以它必须适合16位。
我的第一次尝试如下:
public byte[] encode() {
final int MESSAGE_SIZE = 10;
Bytebuffer buffer = ByteBuffer.allocate(MESSAGE_SIZE);
buffer.putInt(someInt);
buffer.putShort(portValue);
buffer.putInt(someOtherInt);
return buffer.array();
}但很明显,如果我只使用一个空号,我就不能代表32,767以上的港口。
我的问题是,如何将一个可达65536的值作为短值放入缓冲区,以便接收API能够在16位内解释它?
谢谢!
发布于 2016-01-25 17:11:21
您只需在程序中使用普通的int来存储端口。当您想要将int作为16位值发送到线路上时,只需将其转换为空值即可。这只是丢弃了高阶16位(反正你没有使用),而低阶16位则保持不变。示例:
public byte[] encode() {
final int MESSAGE_SIZE = 10;
int portValue = 54321;
Bytebuffer buffer = ByteBuffer.allocate(MESSAGE_SIZE);
buffer.putInt(someInt);
buffer.putShort((short) portValue);
buffer.putInt(someOtherInt);
return buffer.array();
}来自收缩本原反式:
缩小符号整数到整型T的转换只会丢弃除n个最低阶位外的所有比特,其中n是用来表示T型的位数。
https://stackoverflow.com/questions/34998080
复制相似问题