Java中byte数组与int、long、short转换工具类实现
在Java开发中,网络通信或文件解析常涉及将基本数据类型转换为byte数组。本文整理了Java中byte数组与int、long、short等类型相互转换的核心代码实现,重点演示了位运算在高低位处理及字节序(Byte Order)转换中的应用。
核心转换逻辑与方法
Java中的 byte 是有符号类型(-128~127),而在处理无符号数值或网络协议数据时,通常需要将其视为0~255的范围。以下工具类展示了如何将单字节、双字节、四字节及八字节数据在数值类型与字节数组之间进行无损转换。
准备条件与注意事项
- 字节序问题:常见的网络传输和大多数文件格式采用大端序(Big-Endian,高字节在前)。上述转换方法默认基于大端序构建,若目标环境为小端序(Little-Endian),需调整位移方向或读取顺序。
- 负数处理:由于Java
byte有符号,直接强制转换可能导致值错误,务必使用& 0xFF进行屏蔽以获取无符号值。
第1步:无符号byte与十六进制转换
目的:将单个字节安全地转为32位整数(去除高位符号扩展)或十六进制字符串。
public class DataTypeChangeHelper {
/**
* 将一个单字节的byte转换成32位的int
* @param b byte
* @return convert result
*/
public static int unsignedByteToInt(byte b) {
return (int) b & 0xFF;
}
/**
* 将一个单字节的Byte转换成十六进制的数
* @param b byte
* @return hex string
*/
public static String byteToHex(byte b) {
int i = b & 0xFF;
return Integer.toHexString(i);
}
第2步:4字节byte数组转32位int/64位long
目的:从字节数组中提取一个完整的32位整数或64位长整数值。注意该方法用于返回 long 是为了兼容更大的整数范围,但在实际32位场景下可直接截断。
/**
* 将一个4byte的数组转换成32位的int
* @param buf bytes buffer
* @param pos 开始转换的位置
* @return convert result as long (for safety)
*/
public static long unsigned4BytesToInt(byte[] buf, int pos) {
int firstByte = 0x000000FF & ((int) buf[pos]);
int secondByte = 0x000000FF & ((int) buf[pos + 1]);
int thirdByte = 0x000000FF & ((int) buf[pos + 2]);
int fourthByte = 0x000000FF & ((int) buf[pos + 3]);
// 组合字节,确保结果正确性
return ((long) (firstByte << 24 | secondByte << 16 | thirdByte << 8 | fourthByte)) & 0xFFFFFFFFL;
}第3步:short与byte[]互转
目的:将16位短整型数据序列化或反序列化为2字节数组。使用循环结构可以提高复用性。
/**
* 将16位的short转换成byte数组
* @param s short
* @return byte[] 长度为2
*/
public static byte[] shortToByteArray(short s) {
byte[] targets = new byte[2];
for (int i = 0; i < 2; i++) {
int offset = (targets.length - 1 - i) * 8; // 大端序计算偏移
targets[i] = (byte) ((s >>> offset) & 0xff);
}
return targets;
}第4步:int、long与byte[]互转
目的:处理32位整数和64位长整数的字节流转换。以下示例展示了两种常见写法:位移法和直接赋值法。
1. 通用位移法(支持long):
/**
* long to byte[], 使用大端序
*/
public static byte[] longToByteArray(long s) {
byte[] targets = new byte[8];
for (int i = 0; i < 8; i++) {
int offset = (targets.length - 1 - i) * 8;
targets[i] = (byte) ((s >>> offset) & 0xff);
}
return targets;
}2. 手动分配位法(仅适用于int):
/** 32位int转byte[],大端序 */
public static byte[] int2byte(int res) {
byte[] targets = new byte[4];
targets[0] = (byte) (res & 0xff); // 最低位放在最后(大端)
targets[1] = (byte) ((res >> 8) & 0xff); // 次低位
targets[2] = (byte) ((res >> 16) & 0xff); // 次高位
targets[3] = (byte) (res >>> 24); // 最高位
return targets;
}
/**
* 将长度为4的byte数组转换为32位int (注:原文函数名和参数为2长度,此处按标准32位修正)
* @param res byte[] 长度应为4
* @return int
*/
public static int byte2int(byte[] res) {
int targets = (res[0] & 0xff) | ((res[1] << 8) & 0xff00) | ((res[2] << 16) & 0xff0000) | ((res[3] << 24));
return targets;
}以上就是Java byte数组与int、long、short、byte转换的详细实现,更多关于Java基础数据类型的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













