基于java中byte数组与int类型的转换(两种方法)
在Java编程中,将`int`类型转换为`byte`数组以及从`byte`数组还原回`int`类型是常见的操作,特别是在网络编程中。这是因为网络传输的数据通常以字节流的形式存在,而`int`等基本数据类型需要进行适当的序列化才能适应这种格式。本文将详细介绍两种不同的方法来实现这种转换。 ### 方法一:手动位操作转换 #### `int`转`byte`数组 ```java 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; } ``` 这里使用了位操作来实现转换。`&` 是按位与操作符,`>>` 是有符号右移操作符,`>>>` 是无符号右移操作符。通过这些操作,我们将`int`的每一位分别存储到`byte`数组的不同位置。 #### `byte`数组转`int` ```java public static int byte2int(byte[] res) { int targets = (res[0] & 0xff) | ((res[1] << 8) & 0xff00) | // | 表示按位或 ((res[2] << 24) >>> 8) | // 因为byte左移24位会变成int的最高位,所以需要右移8位 (res[3] << 24); return targets; } ``` 在这个方法中,我们按相反的顺序将`byte`数组中的值组合起来,形成原始的`int`值。注意,由于`byte`类型的范围是 `-128` 到 `127`,在进行位运算时可能会丢失高8位,因此需要使用`& 0xff`来保留低8位。 ### 方法二:使用`DataInput`和`DataOutput`流 ```java public static void main(String[] args) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); try { dos.writeInt(41777); // 直接写入int值 // dos.writeByte(4); // 不需要手动添加每个字节 // dos.writeByte(1); // 不需要手动添加每个字节 // dos.writeByte(1); // 不需要手动添加每个字节 // dos.writeShort(217); // 不需要手动添加每个字节 } catch (IOException e) { e.printStackTrace(); } byte[] aa = baos.toByteArray(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); DataInputStream dis = new DataInputStream(bais); try { System.out.println(dis.readInt()); // 直接读取int值 } catch (IOException e) { e.printStackTrace(); } try { dos.close(); dis.close(); } catch (IOException e) { e.printStackTrace(); } } ``` 这种方法利用了`DataOutputStream`和`DataInputStream`提供的便捷方法来直接处理`int`等基本数据类型的写入和读取。`writeInt()`会自动处理`int`到`byte`数组的转换,而`readInt()`则可以将字节流中的数据恢复为`int`。这种方法更加简洁,但需要额外的IO操作。 总结来说,这两种方法在不同的场景下各有优势。手动位操作的方式更加灵活,不依赖于IO流,适用于简单的转换场景;而使用`DataInput`和`DataOutput`流则更方便,适用于需要频繁进行输入输出操作的情况。根据实际需求,开发者可以选择合适的方法进行数据转换。