使用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编码和解码时,需要注意原始数据的类型(如字节数组、字符串等)和编码器的选择。

相关推荐
Daniel 大东8 分钟前
BugJson因为json格式问题OOM怎么办
java·安全
Theodore_10224 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸5 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象6 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了6 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·6 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic7 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王7 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康7 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神7 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式