系列文章目录
SpringBoot整合RabbitMQ并实现消息发送与接收
解析JSON格式参数 & 修改对象的key
VUE整合Echarts实现简单的数据可视化
Java中运用BigDecimal对字符串的数值进行加减乘除等操作
List<HashMap<String,String>>实现自定义字符串排序(key排序、Value排序)
更多该系列文章请查看我的主页哦
文章目录
- 系列文章目录
- 前言
- 一、数据准备
- 二、场景分析
- 三、BASE64编码
- 3.1 代码
- 3.2 效果图
- 四、BASE64解码
- 4.1 代码
- 4.2 效果图
- 总结
前言
BASE64编码是一种将二进制数据转换为ASCII字符的编码方式,常用于在网络传输中传递、保存二进制数据。BASE64编码可以将任意的二进制数据转换为文本字符串形式,由于其特殊的编码方式,不易被人直接识别,也比较难以被篡改。
Java语言中提供了BASE64编码解码的支持,可以很方便地进行编码和解码操作。使用BASE64编码/解码非常简单,只需要调用相应的编码器或解码器即可。在进行BASE64编码解码时,需要注意数据类型的转换,以及一些特殊字符的处理。
下面我们来介绍如何在Java中进行BASE64编码解码操作,以及一些注意点和实例演示,帮助大家更好地掌握这个知识点。
一、数据准备
在前言中我们也了解了BASE64编码主要是在网络传输中使用,这样不易被人直接识别,也比较难以被篡改。所以我们在发送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编码在很多场景中都有广泛的应用,下面是一些常见的场景分析:
- 数据传输:在网络通信中,有些数据可能包含特殊字符或无法直接传输,此时可以将数据进行BASE64编码,以文本形式传输。接收端再对数据进行解码恢复到原始格式。
- 图片和文件传输:在Web开发中,经常会涉及图片和文件的传输。由于HTTP协议仅支持文本传输,因此需要将二进制图片或文件进行BASE64编码后,以文本形式嵌入到网页或API请求中。
- 数据存储:有些数据库或系统只支持文本类型的存储,无法直接存储二进制数据。在这种情况下,可以对二进制数据进行BASE64编码后存储到数据库或其他存储介质中。
- 密钥交换:在加密算法中,密钥的传输和存储需要保证安全性。使用BASE64编码可以将密钥从二进制转换为文本形式,以便于传输和存储。
需要注意的是,BASE64编码虽然可以保证数据传输的可靠性,但它并非加密算法,无法提供数据的安全性。因此,在涉及敏感信息的场景中,仍需要结合其他加密手段来保障数据的安全性。
三、BASE64编码
3.1 代码
通过上述的描述,大家应该对BASE64有了一定的理解,下面我们来使用java代码实现BASE64编码,就对上述的json串进行编码:
//编码 :encode 获得字符串的byets后在进行编码jsonObject.getBytes()
byte[] encodedBytes = java.util.Base64.getEncoder().encode(jsonObject.getBytes());
String base64Str = new String(encodedBytes);
System.out.println("这是编码后的base64串:" + base64Str);
具体解释如下:
- byte[] encodedBytes = java.util.Base64.getEncoder().encode(jsonObject.getBytes());:首先,将jsonObject对象转换为字节数组,并使用java.util.Base64.getEncoder()获取BASE64编码器,然后对字节数组进行编码得到编码后的字节数组encodedBytes。
- String base64Str = new String(encodedBytes);:将编码后的字节数组encodedBytes转换为字符串形式,即获取到BASE64编码后的字符串base64Str。
- System.out.println(“这是编码后的base64串:” + base64Str);:打印输出编码后的BASE64串。
总结:该代码段实现了将一个JSON对象进行BASE64编码,并将编码结果以字符串形式打印输出。
3.2 效果图
通过上述的代码对json串进行编码,就可以拿到编码后的字符串。运行效果如下图所示:
四、BASE64解码
4.1 代码
编码后我们就可以传送了,但用户在接收到json数据后需要解码后往数据库中存储或做处理,所以这里我们写解码代码如下:
//这个转空格为"+"号 有空格转的时候会报错(非法字符)。
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格式的字符串并输出。
- 使用**replace()**方法替换空格为"+“号。这里使用了正则表达式” "来匹配空格,因为Java的字符串操作中,空格是一个特殊字符,需要使用正则表达式来匹配。
- 使用**java.util.Base64.getDecoder().decode()**方法对替换后的Base64编码字符串进行解码。解码后的结果是一个字节数组。
- 使用**new String(basebyte, “utf-8”)**方法将解码后的字节数组转换为UTF-8格式的字符串。
- 输出解码后的字符串。
需要注意的是,这段代码中使用了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编码和解码。常用的方法包括:
- encode()方法:将原始数据转换为Base64编码的字符串。
- getEncoder()方法:获取一个Base64编码器,用于将数据转换为Base64编码的字符串。
- decode()方法:将Base64编码的字符串转换为原始数据。
- getDecoder()方法:获取一个Base64解码器,用于将Base64编码的字符串转换为原始数据。
在使用Base64编码和解码时,需要注意原始数据的类型(如字节数组、字符串等)和编码器的选择。