转换前,需要先对byte[]认识清楚,所以不得不提到大端Big-endian和小端Little-endian的概念。

java中一个int整数占4个byte,我们先假设它只占2个byte的情况。假设x的值为16bit宽的数0x1234,那么0x12为高字节,0x34为低字节。

x在Little-endian模式CPU内存中的存放方式如下:

1
2
内存地址	0x4000	0x4001
存放内容	0x34	0x12

x在Big-endian模式CPU内存中的存放方式为:

1
2
内存地址	0x4000	0x4001
存放内容	0x12	0x34

把int转为byte[]的方法是,先通过&运算让int中只保留我们需要的那个字节,然后作右移运算把这个数变为一个字节。本质上,是把一个整数分成几部分,存到一个数组中。假设我们使用Little-endian模式,即低字节在前面,高字节在后面。比如低字节是bytes[0],代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public static byte[] intToBytes(final int num)
{
	//bytes from low byte to high byte
	byte[] bytes = new byte[4];
	bytes[0] = (byte) (0xff & num);
	bytes[1] = (byte) ((0xff00 & num) >> 8);
	bytes[2] = (byte) ((0xff0000 & num) >> 16);
	bytes[3] = (byte) ((0xff000000 & num) >> 24);
	return bytes;
}

把byte[]转为int的方法是,还是假设Little-endian模式,低字节在前面。在下面的代码中,低字节bytes[0]先左移0位即可,然后通过异或运算加上其它字节即可。这里假设byte[]的长度不超过4。本质上,我们是把一个字节数组合并为一个整数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public static int bytesToInt(byte[] bytes)
{
	//bytes from low byte to high byte
	int value = 0;
	for (int i = 0; i < bytes.length; i++)
	{
		//value += (int)bytes[i] << (8*i);
		value |= (bytes[i] & 0xFF) << (8*i);
	}
	return value;
}