Java默认大端字节序,与小端设备交互需显式处理:用ByteBuffer.order()切换字节序,或调用Integer.reverseBytes()等方法翻转值,解析字节数组推荐ByteBuffer.wrap().order().getInt()。

Java 默认使用大端字节序(Big-Endian)处理多字节数据,比如 int、long、float 等在 ByteBuffer 中的存储和读取。但实际开发中常需与小端(Little-Endian)设备或协议交互(如某些嵌入式系统、Windows API、部分网络协议),这时必须显式处理字节序转换。
用 ByteBuffer 控制字节序
ByteBuffer 是 Java 中最常用且推荐的字节序处理工具。它内部维护一个 order(ByteOrder) 方法,可自由切换:
- 默认是
ByteOrder.BIG_ENDIAN - 设为小端:调用
buffer.order(ByteOrder.LITTLE_ENDIAN) - 设置后,所有
putInt()、getInt()、putLong()等方法均按该顺序读写
示例:将 int 值 0x12345678 写成小端字节数组
ByteBuffer bb = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN); bb.putInt(0x12345678); byte[] bytes = bb.array(); // 结果为 [0x78, 0x56, 0x34, 0x12]
手动翻转字节(适用于简单场景)
对单个基本类型,可手写翻转逻辑。适合不依赖 ByteBuffer 的轻量操作,也便于理解原理:
立即学习“Java免费学习笔记(深入)”;
-
int 小端 → 大端(或反之):
Integer.reverseBytes(i) -
short:
Short.reverseBytes(s) -
long:
Long.reverseBytes(l) -
char:
Character.reverseBytes(c)
注意:这些方法返回的是**值翻转后的结果**,不是字节数组;它们把数值按位重新排列,等效于按小端解释原值再转成大端值(或反之)。
处理字节数组与基本类型的互转
当已有字节数组(如从 socket 或文件读到的原始数据),需按指定字节序解析时:
- 推荐方式:用
ByteBuffer.wrap(bytes).order(...).getInt() - 避免手写位运算(易错、难维护)
- 若数组长度不足或偏移越界,会抛
BufferUnderflowException,注意捕获或预判
例如:从 4 字节小端数组还原 int
byte[] data = {0x78, 0x56, 0x34, 0x12};
int value = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN).getInt();
// value == 0x12345678
注意平台无关性与序列化兼容性
Java 的 ObjectOutputStream 和 DataOutputStream 固定使用大端,这是 JVM 规范定义的,不可更改。若需跨语言通信(如与 C 小端程序对接),不能直接用 DataInputStream 读对方发来的小端数据——必须用 ByteBuffer 并显式设为小端。
JSON、XML、Protobuf 等高级序列化格式通常屏蔽字节序问题,但二进制协议(如自定义 TCP 报文、Modbus、BMP 文件头)必须严格匹配字节序。


















