Java中byte数组与int、long、short转换工具类实现

何川
何川
发布时间:2026-10-14 | 3人浏览过
原创

在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基础数据类型的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表