开发中需要自定义udp数据包,还需要与蓝牙设备通信,这都需要直接操作byte数据类型。使用中略有波折,这里简单记录一下操作方法。

java中为大段字节序,所以以下不需要考虑字节序的影响

int转换为byte,使用强制类型转换,结果为int低8位

1
2
int i = 0x0102;
byte b = (byte) i;

转换完成后b值为2(0x02)。

int转换为byte[]

首先确保int数值在合理区间,再进行操作,以16位数为例:

1
2
3
4
int i = 0x0102;
byte[] buf = new byte[2];
buf[0] = (byte) (i >> 8);
buf[1] = (byte) i;

转换完成后buf[0]值为0x01,buf[2]值为0x02。
当位数未32且符号位有可能被使用的情况下,为方便使用,使用long转换为byte数组

byte转换为int

  1. 值转换
    1
    2
    byte b = -1;
    int i = b;

此时b为0xff,i为-1(0xffffffff)。

  1. 位转换
    1
    2
    byte b = -1;
    int i = b & 0xff;

此时b为0xff,i值为65535(0xff)。

byte[]转换为int,位转换

以16位数为例

1
2
3
4
5
6
byte[] buf = {
0x01,
0x02,
};
int i = buf[0] & 0xff;
i = (i << 8) | (buf[1] & 0xff);

此时i值为258(0x0102)。
当位数为32且符号位有可能被使用的情况下,为方便使用,使用long解析byte数组,方法同上