如何使用Java中的字节数组函数
Java中的字节数组是一个常用的数据结构,在处理文件、网络数据传输、加密等方面经常用到。Java提供了很多字节数组相关的函数,本文将介绍如何使用Java中的字节数组函数。
一、字节数组的创建
在Java中创建字节数组很简单,可以使用new关键字创建一个指定大小的空数组,也可以使用字面值的方式创建一个初始化的数组。下面我们来看一下具体的代码实现。
//创建一个大小为10的空字节数组
byte[] byteArray1 = new byte[10];
//创建一个初始化的字节数组
byte[] byteArray2 = {1,2,3,4,5};
//创建一个空的字节数组,并且设置其长度为5
byte[] byteArray3 = new byte[5];
//使用Arrays类的fill方法将byteArray3数组填充为0
Arrays.fill(byteArray3,(byte)0);
在代码中我们使用了Arrays类的fill方法对字节数组进行了初始化,这个方法可以将一个数组中的所有元素设置为指定的值。在Java中,byte类型的值范围是-128~127,如果我们想将数组中所有元素设置为0,就必须将0强制转换为byte类型。
二、字节数组的操作
1、复制字节数组
在Java中,我们可以使用System类提供的arraycopy方法将一个字节数组复制到另一个字节数组中。这个方法的语法如下:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
这个方法的参数解释如下:
src:源数组
srcPos:源数组中的起始位置
dest:目标数组
destPos:目标数组的起始位置
length:要复制的元素个数
下面我们来看一下具体的代码实现。
byte[] src = {1,2,3,4,5};
byte[] dest = new byte[5];
//将src数组中从第2个元素开始的3个元素复制到dest数组中从第0个元素开始的3个位置上
System.arraycopy(src,2,dest,0,3);
//输出dest数组的内容
System.out.println(Arrays.toString(dest)); //输出结果为 [3, 4, 5, 0, 0]
在代码中我们将src数组中从第2个元素开始的3个元素复制到了dest数组中从第0个元素开始的3个位置上,并且输出了复制完毕后的dest数组的内容。
2、判断字节数组是否相等
在Java中,我们可以使用Arrays类提供的equals方法判断两个字节数组是否相等。这个方法的语法如下:
public static boolean equals(byte[] a, byte[] a2)
下面我们来看一下具体的代码实现。
byte[] byteArray1 = {1,2,3,4,5};
byte[] byteArray2 = {1,2,4,4,5};
byte[] byteArray3 = {1,2,3,4,5};
//判断byteArray1数组是否等于byteArray2数组
System.out.println(Arrays.equals(byteArray1,byteArray2)); //输出结果为 false
//判断byteArray1数组是否等于byteArray3数组
System.out.println(Arrays.equals(byteArray1,byteArray3)); //输出结果为 true
在代码中我们通过equals方法判断了两个字节数组是否相等,并且输出了比较结果。
3、转换字节数组为字符串
在Java中,我们可以使用String类提供的构造函数将一个字节数组转换为一个字符串。这个构造函数的语法如下:
public String(byte[] bytes)
下面我们来看一下具体的代码实现。
byte[] byteArray = {97,98,99,100,101,102}; //a,b,c,d,e,f
//将byteArray字节数组转换为字符串
String str = new String(byteArray);
//输出转换结果
System.out.println(str); //输出结果为 abcdef
在代码中我们将一个字节数组转换为了一个字符串,并且输出了转换后的结果。
4、转换字符串为字节数组
在Java中,我们可以使用String类提供的getBytes方法将一个字符串转换为一个字节数组。这个方法的语法如下:
public byte[] getBytes()
下面我们来看一下具体的代码实现。
String str = "abcdef";
//将字符串转换为字节数组
byte[] byteArray = str.getBytes();
//输出转换结果
System.out.println(Arrays.toString(byteArray)); //输出结果为 [97, 98, 99, 100, 101, 102]
在代码中我们将一个字符串转换为了一个字节数组,并且输出了转换后的结果。
三、字节数组的加密与解密
在Java中,我们可以使用MessageDigest类提供的MD5、SHA、HMAC等算法对文本内容进行加密,同时也可以使用相应的算法对加密后的数据进行解密。下面我们来看一下具体的代码实现。
1、MD5加密
MD5是一种常用的消息摘要算法,可以将任意长度的消息压缩成一个128位的密文。下面我们来看一下如何使用Java的MessageDigest类实现MD5加密。
//需要加密的字符串
String password = "123456";
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] byteArray = md5.digest(password.getBytes());
System.out.println(Arrays.toString(byteArray)); //输出加密后的结果
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
在代码中,我们使用MessageDigest.getInstance("MD5")获取MD5加密算法实例,然后使用digest方法对需要加密的字符串进行加密,并输出加密后的结果。
2、AES加密
AES是一种常用的对称加密算法,可以加密任意长度的数据,安全性较高。下面我们来看一下如何使用Java的Cipher类实现AES加密。
//需要加密的字符串
String password = "123456";
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = new SecureRandom();
keyGenerator.init(256,secureRandom);
SecretKey secretKey = keyGenerator.generateKey();
IvParameterSpec ivParameterSpec = new IvParameterSpec(secureRandom.generateSeed(16));
cipher.init(Cipher.ENCRYPT_MODE,secretKey,ivParameterSpec);
byte[] byteArray = cipher.doFinal(password.getBytes());
System.out.println(Arrays.toString(byteArray)); //输出加密后的结果
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException | InvalidAlgorithmParameterException e) {
e.printStackTrace();
}
在代码中,我们使用KeyGenerator.getInstance("AES")获取AES加密算法实例,然后使用init方法初始化算法的key,使用IvParameterSpec生成初始化向量,并使用cipher.init方法对算法进行初始化;最后使用Cipher.doFinal方法对需要加密的字符串进行加密,并输出加密后的结果。
3、AES解密
解密的过程与加密的过程很类似,只需要将加密算法对象的初始化模式设置为decrypt_mode。
//需要解密的字节数组
byte[] byteArray = {87,-4,34,109,-99,-37,-25,-46,18,61,-127,-28,-73,-14,-18,66};
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = new SecureRandom();
keyGenerator.init(256,secureRandom);
SecretKey secretKey = keyGenerator.generateKey();
IvParameterSpec ivParameterSpec = new IvParameterSpec(secureRandom.generateSeed(16));
cipher.init(Cipher.DECRYPT_MODE,secretKey,ivParameterSpec);
byte[] result = cipher.doFinal(byteArray);
System.out.println(new String(result)); //输出解密后的结果
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException | InvalidAlgorithmParameterException e) {
e.printStackTrace();
}
在代码中,我们使用Cipher.getInstance("AES/CBC/PKCS5Padding")获取AES加密算法实例,
