java nio中bytebuffer默认大端序,需调用order(byteorder.little_endian)显式设为小端;读写多字节类型时字节序必须一致,否则解析错误;小端示例:1234写入后字节数组为[d2,04,00,00];解析时须wrap并设相同序;打印字节应用b&0xff避免符号扩展。

Java NIO 中处理 ByteBuffer 的字节序,核心就是通过 order(ByteOrder) 方法显式设置,否则默认使用大端序(Big Endian)。
默认是大端序,小端需主动指定
ByteBuffer 创建后,字节序自动为 ByteOrder.BIG_ENDIAN。若要按小端序读写整数、长整型等多字节类型,必须调用 .order(ByteOrder.LITTLE_ENDIAN),且该设置需在 put/get 操作前完成。
- 设置一次即生效,影响后续所有
putInt()、getInt()等视图操作 - 不设或设错会导致数据高位/低位字节位置颠倒,解析结果完全错误
- 同一个 ByteBuffer 实例不能“同时”支持两种字节序;如需双向转换,应分别创建两个 buffer 或重置 order
典型小端序整数转换示例
将 int 值 1234(十六进制为 0x04D2)转为小端字节数组 [D2, 04, 00, 00]:
ByteBuffer bb = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN);bb.putInt(1234);byte[] bytes = bb.array(); // 得到长度为 4 的字节数组
注意:array() 返回的是底层字节数组,索引 0 对应最低有效字节(LSB),符合小端定义。
读取时字节序必须与写入一致
用 ByteBuffer 解析已有字节数组(比如从网络或文件读到的原始字节),必须用 wrap() 并明确设置相同字节序:
byte[] raw = { (byte)0xD2, 0x04, 0x00, 0x00 };int value = ByteBuffer.wrap(raw).order(ByteOrder.LITTLE_ENDIAN).getInt(); // 得到 1234- 若漏掉
.order(...),会按大端解析成0xD2040000(远大于预期)
避免常见陷阱:符号扩展与十六进制打印
直接打印 byte 值会出现负数(如 -46 对应 0xD2),因为 Java 的 byte 是有符号类型。格式化为两位十六进制时务必用 %02X 并做无符号处理:
- 错误:
System.out.println(b); // 输出 -46 - 正确:
System.out.printf("%02X ", b & 0xFF); // 输出 D2 - 推荐封装工具方法统一处理,避免每次手动 & 0xFF
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











