欢迎访问宙启技术站
智能推送

如何使用Java中的字节数组函数

发布时间:2023-06-25 19:07:14

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加密算法实例,