Java 16进制Byte数组

Java是一种广泛使用的编程语言,其提供了丰富的数据类型和数据结构来处理各种编程需求。其中,byte数组是Java中一种常用的数据类型,用于存储字节数据。在某些情况下,我们需要将byte数组转换为16进制表示形式,并在需要时还原为原始的byte数组。本文将介绍如何在Java中使用代码示例实现这一过程。

什么是16进制?

在计算机科学中,16进制是一种常用的数字表示方法,它使用0-9和A-F这16个字符来表示数字0-15。每个16进制字符可以表示4个二进制位,因此在计算机中十分便于表示和处理二进制数据。例如,十进制数15在16进制中表示为F,二进制表示为1111。

16进制和byte数组的转换

在Java中,byte数组可以使用byte[]类型来声明和操作。要将byte数组转换为16进制表示形式,我们可以使用java.lang.Integer类中的静态方法toHexString()。这个方法接受一个int类型的参数,并返回其16进制表示形式的字符串。

byte[] byteArray = {0x12, 0x34, 0x56, 0x78};
String hexString = Integer.toHexString(byteArray);
System.out.println(hexString);

输出结果为:"12345678"。

要将16进制字符串转换回byte数组,我们可以使用java.lang.Integer类中的静态方法parseInt()。这个方法接受一个表示16进制数的字符串,并返回对应的int值。

String hexString = "12345678";
int intValue = Integer.parseInt(hexString, 16);
byte[] byteArray = new byte[] {
    (byte)(intValue >> 24),
    (byte)(intValue >> 16),
    (byte)(intValue >> 8),
    (byte)intValue
};
System.out.println(Arrays.toString(byteArray));

输出结果为:"[18, 52, 86, 120]"。

上述示例中,我们使用位移操作符将int值拆分为4个字节,并创建一个新的byte数组。请注意,使用位移操作符时,我们需要将int值转换为byte类型,以便在byte数组中正确存储数据。

示例应用:文件加密和解密

现在,我们将使用上述的byte数组和16进制转换示例来实现一个简单的文件加密和解密程序。我们将使用异或运算来加密和解密文件。

加密过程如下:

  1. 读取源文件的字节数据,并将其存储在一个byte数组中。
  2. 遍历byte数组,对每个字节使用一个密钥进行异或运算。
  3. 将加密后的byte数组转换为16进制字符串,并将其写入目标文件。

解密过程如下:

  1. 从目标文件中读取16进制字符串。
  2. 将16进制字符串转换为byte数组。
  3. 遍历byte数组,对每个字节使用相同的密钥进行异或运算。
  4. 将解密后的byte数组写入原始文件。

下面是加密和解密的示例代码:

import java.io.*;
import java.util.Arrays;

public class FileEncryption {
    private static final byte ENCRYPTION_KEY = 0x55;

    public static void encryptFile(File source, File target) {
        try (InputStream inputStream = new FileInputStream(source);
             OutputStream outputStream = new FileOutputStream(target)) {
            byte[] byteArray = inputStream.readAllBytes();
            for (int i = 0; i < byteArray.length; i++) {
                byteArray[i] = (byte)(byteArray[i] ^ ENCRYPTION_KEY);
            }
            String hexString = Integer.toHexString(byteArray);
            outputStream.write(hexString.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void decryptFile(File source, File target) {
        try (InputStream inputStream = new FileInputStream(source);
             OutputStream outputStream = new FileOutputStream(target)) {
            byte[] byteArray = inputStream.readAllBytes();
            String hexString = new String(byteArray);
            int intValue = Integer.parseInt(hexString, 16);
            byteArray = new byte[] {
                (byte)(intValue >> 24),
                (byte)(intValue >> 16),
                (byte)(intValue >> 8),
                (byte)intValue
            };
            for (int i = 0; i < byteArray.length; i++) {
                byteArray[i] = (byte