最稳妥推荐使用ByteBuffer,它自动处理字节序、内存对齐和边界检查;int/long/float/double可分别用putInt/putLong/putFloat等方法转byte[],默认大端,小端需显式设置ByteOrder.LITTLE_ENDIAN。

最稳妥、推荐的方式是用 ByteBuffer,它自动处理字节序、内存对齐和边界检查,适合绝大多数传输场景(如网络通信、串口、文件写入)。
用 ByteBuffer 转换(首选)
Java 标准库提供的方案,安全、简洁、可读性强:
-
int → byte[]:分配 4 字节缓冲区,调用
putInt(),再取底层数组byte[] bytes = ByteBuffer.allocate(4).putInt(123456).array(); -
long → byte[]:分配 8 字节,用
putLong()byte[] bytes = ByteBuffer.allocate(8).putLong(9876543210L).array(); -
float/double → byte[]:直接支持 IEEE 754 编码
byte[] fBytes = ByteBuffer.allocate(4).putFloat(3.14f).array(); -
注意字节序:默认大端(Big-Endian),若协议要求小端,加
.order(ByteOrder.LITTLE_ENDIAN)
手动位运算(仅限理解原理或特殊需求)
不推荐日常使用,但需了解其逻辑,比如解析硬件协议或性能极致场景:
-
int → byte[4](大端):
b[0] = (byte)(i >> 24); b[1] = (byte)(i >> 16); b[2] = (byte)(i >> 8); b[3] = (byte)i; -
关键细节:byte 是有符号类型,还原时必须与
0xFF按位与,避免符号扩展错误
例如:(bytes[0] & 0xFF) -
double/float 手动转:先转为 long/int 位模式,再拆字节
long bits = Double.doubleToLongBits(value);,然后右移 + 强制转 byte
其他类型要注意的点
不是所有基本类型都能无歧义地“一对一”映射为字节序列:
-
boolean:Java 不规定其内存大小;ByteBuffer 默认用 1 字节(0 或 1),但
putBoolean()会跳过对齐,建议显式用put((byte)(b ? 1 : 0)) -
char:2 字节 UTF-16 编码(大端),不是单字节;如需 UTF-8 应走
String.valueOf(c).getBytes(StandardCharsets.UTF_8) -
byte 和 Byte:单个
byte就是 1 字节;包装类Byte需先拆箱再处理
实际传输前的小提醒
字节数组本身不含类型信息,接收方必须严格按约定长度和顺序解析:
- 比如发送
int + short + float,就得提前约定共 4+2+4=10 字节,且顺序固定 - 避免用
String.getBytes()处理数字——它转的是字符编码(如 "123" 变 3 个 ASCII 字节),不是数值二进制 - 十六进制字符串(如 "A8 0F")要先解析成字节,不能直接
getBytes()

















