int to byte and byte to int
May 23, 2019 · View on GitHub
这里看下 Java IO 流处理 (int -> byte) 和 (byte -> int)的细节实现
下面的代码片段来自 org.apache.dubbo.common.io.Bytes, 在 Java IO 包中也有类似的 代码,可参看 java.io.Bits
int to byte
org.apache.dubbo.common.io.Bytes#int2bytes
// 这里用到了 无符号的右移 >>>
public static void int2bytes(int v, byte[] b, int off) {
b[off + 3] = (byte) v;// b[off + 3] = (byte) v >>> 0;
b[off + 2] = (byte) (v >>> 8);
b[off + 1] = (byte) (v >>> 16);
b[off + 0] = (byte) (v >>> 24);
// b[off + 0] = (byte) ((v >> 24) & 0xFF);
}
下图的第一行代表要被转化成 byte 的 int ,一个 int 32 位,一个字节 8 位,因此一个 int 占用四个字节
byte index 标识 int 四个字节在 byte 中的位置
>>24二进制向右移动 24 ,>>24右移之后,对应的这一行绿色的最左边的8个字节,会被移动到黄色的位置,而后使用(byte)进行强制类型转化,只保留了最低位(黄色部分的8个字节),这样就就int的最高位的8个字节放到了byte数组index = 0的位置上
其它的 >>>8 和 >>>16 是同样的道理
b[off + 3] = (byte) v (int -> byte)强制转化,就是只保留最低位的 8 个字节,高位的会被舍弃
进行上面的四个步骤之后,一个 int 就被存储在一个长度为4的字节数组中了

byte to int
org.apache.dubbo.common.io.Bytes#bytes2int
public static int bytes2int(byte[] b, int off) {
return ((b[off + 3] & 0xFF) << 0) +
((b[off + 2] & 0xFF) << 8) +
((b[off + 1] & 0xFF) << 16) +
((b[off + 0]) << 24);
}