使用BASE64实现编码和解码

系列文章目录

SpringBoot整合RabbitMQ并实现消息发送与接收
解析JSON格式参数 & 修改对象的key
VUE整合Echarts实现简单的数据可视化
Java中运用BigDecimal对字符串的数值进行加减乘除等操作
List<HashMap<String,String>>实现自定义字符串排序(key排序、Value排序)

更多该系列文章请查看我的主页哦


文章目录


前言

BASE64编码是一种将二进制数据转换为ASCII字符的编码方式,常用于在网络传输中传递、保存二进制数据。BASE64编码可以将任意的二进制数据转换为文本字符串形式,由于其特殊的编码方式,不易被人直接识别,也比较难以被篡改。

Java语言中提供了BASE64编码解码的支持,可以很方便地进行编码和解码操作。使用BASE64编码/解码非常简单,只需要调用相应的编码器或解码器即可。在进行BASE64编码解码时,需要注意数据类型的转换,以及一些特殊字符的处理。

下面我们来介绍如何在Java中进行BASE64编码解码操作,以及一些注意点和实例演示,帮助大家更好地掌握这个知识点。


一、数据准备

在前言中我们也了解了BASE64编码主要是在网络传输中使用,这样不易被人直接识别,也比较难以被篡改。所以我们在发送json数据时一般会用到编码,从而防止被其他人发现。

下面我们就准备一个json数据,如下所示:

json 复制代码
{
  "status": "success",
  "data": {
    "users": [
      {
        "id": 1,
        "name": "John Doe",
        "age": 30,
        "email": "johndoe@example.com"
      },
      {
        "id": 2,
        "name": "Jane Smith",
        "age": 25,
        "email": "janesmith@example.com"
      }
    ],
    "products": [
      {
        "id": 1001,
        "name": "Product A",
        "price": 19.99
      },
      {
        "id": 1002,
        "name": "Product B",
        "price": 29.99
      }
    ]
  },
  "message": "Data retrieved successfully"
}

如果这个数据很重要,我们在传输前就要先进行编码,从而使数据更加安全的进行传输。

二、场景分析

BASE64编码在很多场景中都有广泛的应用,下面是一些常见的场景分析:

  1. 数据传输:在网络通信中,有些数据可能包含特殊字符或无法直接传输,此时可以将数据进行BASE64编码,以文本形式传输。接收端再对数据进行解码恢复到原始格式。
  2. 图片和文件传输:在Web开发中,经常会涉及图片和文件的传输。由于HTTP协议仅支持文本传输,因此需要将二进制图片或文件进行BASE64编码后,以文本形式嵌入到网页或API请求中。
  3. 数据存储:有些数据库或系统只支持文本类型的存储,无法直接存储二进制数据。在这种情况下,可以对二进制数据进行BASE64编码后存储到数据库或其他存储介质中。
  4. 密钥交换:在加密算法中,密钥的传输和存储需要保证安全性。使用BASE64编码可以将密钥从二进制转换为文本形式,以便于传输和存储。

需要注意的是,BASE64编码虽然可以保证数据传输的可靠性,但它并非加密算法,无法提供数据的安全性。因此,在涉及敏感信息的场景中,仍需要结合其他加密手段来保障数据的安全性。

三、BASE64编码

3.1 代码

通过上述的描述,大家应该对BASE64有了一定的理解,下面我们来使用java代码实现BASE64编码,就对上述的json串进行编码:

java 复制代码
		//编码 :encode  获得字符串的byets后在进行编码jsonObject.getBytes()
        byte[] encodedBytes = java.util.Base64.getEncoder().encode(jsonObject.getBytes());
        String base64Str = new String(encodedBytes);
        System.out.println("这是编码后的base64串:" + base64Str);

具体解释如下:

  1. byte[] encodedBytes = java.util.Base64.getEncoder().encode(jsonObject.getBytes());:首先,将jsonObject对象转换为字节数组,并使用java.util.Base64.getEncoder()获取BASE64编码器,然后对字节数组进行编码得到编码后的字节数组encodedBytes。
  2. String base64Str = new String(encodedBytes);:将编码后的字节数组encodedBytes转换为字符串形式,即获取到BASE64编码后的字符串base64Str。
  3. System.out.println("这是编码后的base64串:" + base64Str);:打印输出编码后的BASE64串。

总结:该代码段实现了将一个JSON对象进行BASE64编码,并将编码结果以字符串形式打印输出。

3.2 效果图

通过上述的代码对json串进行编码,就可以拿到编码后的字符串。运行效果如下图所示:

四、BASE64解码

4.1 代码

编码后我们就可以传送了,但用户在接收到json数据后需要解码后往数据库中存储或做处理,所以这里我们写解码代码如下:

java 复制代码
		//这个转空格为"+"号 有空格转的时候会报错(非法字符)。
        String replace = base64Str.replace(" ", "+");
        byte[] basebyte = java.util.Base64.getDecoder().decode(replace);
        String utf8Str = new String(basebyte, "utf-8");
        System.out.println("这是解码后的utf-8串:" + utf8Str);

这段代码的主要功能是将一个Base64编码的字符串中的空格替换为"+"号,然后进行Base64解码,最后将解码后的字节数组转换为UTF-8格式的字符串并输出。

  1. 使用**replace()**方法替换空格为"+"号。这里使用了正则表达式" "来匹配空格,因为Java的字符串操作中,空格是一个特殊字符,需要使用正则表达式来匹配。
  2. 使用**java.util.Base64.getDecoder().decode()**方法对替换后的Base64编码字符串进行解码。解码后的结果是一个字节数组。
  3. 使用**new String(basebyte, "utf-8")**方法将解码后的字节数组转换为UTF-8格式的字符串。
  4. 输出解码后的字符串。

需要注意的是,这段代码中使用了Java的Base64类来进行Base64编码和解码。在使用Base64.getDecoder().decode()方法解码时,解码后的结果是一个字节数组,如果需要将其转换为字符串,需要使用String类的构造方法,如new String(basebyte, "utf-8")。

4.2 效果图

通过上述的代码进行解码,就可以还原编码前的json串,效果图如下所示:

注意:在从字节数组转换为String类型时,如果不加utf-8会出现乱码。


总结

Base64编码的优点是可读性好,可以方便地阅读和传输,同时可以加密数据,防止数据泄露。但是,由于Base64编码的编码长度比原始数据长度更长,所以可能会导致传输速度变慢。此外,Base64编码只能加密原始数据的比特位,不能加密原始数据的值。

在Java中,可以使用java.util.Base64类来进行Base64编码和解码。常用的方法包括:

  1. encode()方法:将原始数据转换为Base64编码的字符串。
  2. getEncoder()方法:获取一个Base64编码器,用于将数据转换为Base64编码的字符串。
  3. decode()方法:将Base64编码的字符串转换为原始数据。
  4. getDecoder()方法:获取一个Base64解码器,用于将Base64编码的字符串转换为原始数据。

在使用Base64编码和解码时,需要注意原始数据的类型(如字节数组、字符串等)和编码器的选择。

相关推荐
xlsw_2 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹3 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭4 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫4 小时前
泛型(2)
java
超爱吃士力架4 小时前
邀请逻辑
java·linux·后端
南宫生4 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石4 小时前
12/21java基础
java
李小白664 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp4 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶5 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb