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进制转换示例来实现一个简单的文件加密和解密程序。我们将使用异或运算来加密和解密文件。
加密过程如下:
- 读取源文件的字节数据,并将其存储在一个byte数组中。
- 遍历byte数组,对每个字节使用一个密钥进行异或运算。
- 将加密后的byte数组转换为16进制字符串,并将其写入目标文件。
解密过程如下:
- 从目标文件中读取16进制字符串。
- 将16进制字符串转换为byte数组。
- 遍历byte数组,对每个字节使用相同的密钥进行异或运算。
- 将解密后的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