Java编码方式:Base64编码与解码

1、Base64 算法介绍

Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。它主要用于在不支持二进制数据的场合(如电子邮件、URL、文件系统名等)传输二进制数据。严格来说 Base64 并不是一种加密/解密算法,而是一种编码方式。Base64 不生成密钥,通过 Base64 编码后的密文就可以直接“翻译”为明文。

Java 提供了对 Base64 编码和解码的支持,通过 java.util.Base64 类来实现。

java.util.Base64 类提供了以下几种主要的功能:

  1. 编码:将二进制数据(如字节数组)编码为 Base64 字符串。
  2. 解码:将 Base64 字符串解码为二进制数据(如字节数组)。
  3. URL 和 MIME 编码:提供了对 URL 和 MIME 安全的 Base64 编码和解码。

Base64字符映射表:

Base64 编码的核心思想是将每三个字节的二进制数据转换为四个字节的文本数据。这四个字节的文本数据是从一个包含64个字符的集合中选择的,这个集合通常包括大写字母A-Z、小写字母a-z、数字0-9、加号(+)、斜杠(/),以及一个用于填充的等号(=)。 

2、Base64 编码与解码

【实例】Java 中使用 Base64 算法,对数据进行编码与解码。

(1)创建 Base64Util 类(Base64编码工具类)。

package com.pjb.util;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 * Base64编码工具类
 * @author pan_junbiao
 **/
public class Base64Util
{
    //字符编码
    public final static String charsetName = StandardCharsets.UTF_8.name();

    /**
     * Base64编码
     */
    public static String encode(String data) throws Exception
    {
        //执行编码
        String encode = Base64.getEncoder().encodeToString(data.getBytes(charsetName));
        return encode;
    }

    /**
     * Base64解码
     */
    public static String decode(String data) throws Exception
    {
        byte[] decode = Base64.getDecoder().decode(data.getBytes(charsetName));
        return new String(decode);
    }

    /**
     * URL安全编码
     */
    public static String urlEncode(String url) throws Exception
    {
        String urlEncode = Base64.getUrlEncoder().encodeToString(url.getBytes(charsetName));
        return urlEncode;
    }

    /**
     * URL安全解码
     */
    public static String urlDecode(String data) throws Exception
    {
        byte[] urlDecode = Base64.getUrlDecoder().decode(data.getBytes(charsetName));
        return new String(urlDecode);
    }

    /**
     * 文件(图片、Word、PDF) 转 Base64 编码
     *
     * @param file 文件
     */
    public static String fileEncode(File file) throws IOException
    {
        String base64Str = null;
        FileInputStream fin = null;
        BufferedInputStream bin = null;
        ByteArrayOutputStream baos = null;
        BufferedOutputStream bout = null;
        try
        {
            fin = new FileInputStream(file);
            bin = new BufferedInputStream(fin);
            baos = new ByteArrayOutputStream();
            bout = new BufferedOutputStream(baos);
            // io
            byte[] buffer = new byte[1024];
            int len = bin.read(buffer);
            while (len != -1)
            {
                bout.write(buffer, 0, len);
                len = bin.read(buffer);
            }
            // 刷新此输出流,强制写出所有缓冲的输出字节
            bout.flush();
            byte[] bytes = baos.toByteArray();
            // Base64字符编码
            base64Str = Base64.getEncoder().encodeToString(bytes).trim();
        } catch (IOException e)
        {
            e.getMessage();
        } finally
        {
            try
            {
                fin.close();
                bin.close();
                bout.close();
            } catch (IOException e)
            {
                e.getMessage();
            }
        }
        return base64Str;
    }

    /**
     * 文件(图片、Word、PDF) 转 Base64 解码(另存文件)
     *
     * @param base64Content Base64 字符串
     * @param filePath      另存文件路径
     */
    public static void fileDecode(String base64Content, String filePath) throws IOException
    {
        BufferedInputStream bis = null;
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        try
        {
            // Base64解码到字符数组
            byte[] bytes = Base64.getDecoder().decode(base64Content);
            ByteArrayInputStream byteInputStream = new ByteArrayInputStream(bytes);
            bis = new BufferedInputStream(byteInputStream);
            File file = new File(filePath);
            File path = file.getParentFile();
            if (!path.exists())
            {
                path.mkdirs();
            }
            fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);
            // io
            byte[] buffer = new byte[1024];
            int length = bis.read(buffer);
            while (length != -1)
            {
                bos.write(buffer, 0, length);
                length = bis.read(buffer);
            }
            // 刷新此输出流,强制写出所有缓冲的输出字节
            bos.flush();
        } catch (IOException e)
        {
            e.getMessage();
        } finally
        {
            try
            {
                bis.close();
                fos.close();
                bos.close();
            } catch (IOException e)
            {
                e.getMessage();
            }
        }
    }
}

(2)使用 Base64 算法,对数据进行编码与解码。

/**
 * 使用 Base64 编码与解码
 */
@Test
public void testBase64() throws Exception
{
    String data = "您好,欢迎访问 pan_junbiao的博客";

    // 1、使用 Base64 编码
    String encode = Base64Util.encode(data);

    // 2、使用 Base64 解码
    String decode = Base64Util.decode(encode);

    // 3、打印结果
    System.out.println("原始数据:" + data);
    System.out.println("编码数据:" + encode);
    System.out.println("解码数据:" + decode);
}

执行结果:

3、URL 编码与解码

对 URL 进行 Base64 编码的主要原因是为了确保 URL 在传输过程中的安全性和可读性。

【实例】Java 中使用 Base64 算法,对 URL 进行编码与解码。

/**
 * 使用 Base64 对 URL 编码与解码
 */
@Test
public void testUrlBase64() throws Exception
{
    String url = "https://blog.csdn.net/pan_junbiao?account=登录账号&password=登录密码";

    // 1、使用 URL安全编码
    String urlEncode = Base64Util.urlEncode(url);

    // 2、使用 Base64 解码
    String urlDecode = Base64Util.urlDecode(urlEncode);

    // 3、打印结果
    System.out.println("原始数据:" + url);
    System.out.println("编码数据:" + urlEncode);
    System.out.println("解码数据:" + urlDecode);
}

执行结果:

4、文件的编码与解码

对文件进行 Base64 编码的原因主要涉及到数据的传输、存储和嵌入等多个方面。

【实例】 Java 中使用 Base64 算法,对文件(如:图片、Word、PDF 等) 进行编码与解码。

/**
 * 使用 Base64 对 文件 编码与解码
 */
@Test
public void testFileBase64() throws Exception
{
    String filePath1 = "E:/file/1.png"; //文件地址
    String filePath2 = "E:/file/2.png"; //文件另存地址

    // 1、使用 Base64 将文件编码
    String fileEncode = Base64Util.fileEncode(new File(filePath1));

    // 2、使用 Base64 将文件解码(另存文件)
    Base64Util.fileDecode(fileEncode, filePath2);
}

执行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/887384.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Springboot+Android的的电子书阅读器系统的设计与实现(含源码+数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…

二分查找一>山脉数组的峰顶索引

1.题目&#xff1a; 2.解析&#xff1a; 代码&#xff1a; public int peakIndexInMountainArray(int[] arr) {int left 1, right arr.length-2;while(left < right) {int mid left (right-left1) / 2;if(arr[mid] > arr[mid-1]) left mid;else right mid-1;}ret…

openpnp - 视觉原点的位置要离设备的软限制点远一点

文章目录 openpnp - 视觉原点的位置要离设备的软限制点远一点笔记备注END openpnp - 视觉原点的位置要离设备的软限制点远一点 笔记 最开始的视觉原点&#xff0c;是在设备X 0, Y 0的附近位置&#xff0c;粘了一块20x20x20的铝块&#xff0c;铝块上面贴着用黑塑料皮打印的1…

esp8266 at指令链接wifi时一直connect disconnest

那是你的连接wifi的名字密码有误或者热点有问题&#xff0c;看看热点是不是把设备拉入黑名单或者设置为5G或者连了校园网或者设置了最多链接设备

IntelliJ IDEA 2024.2 新特性概览

文章目录 1、重点特性:1.1 改进的 Spring Data JPA 支持1.2 改进的 cron 表达式支持1.3 使用 GraalJS 作为 HTTP 客户端的执行引擎1.4 更快的编码时间1.5 K2 模式下的 Kotlin 性能和稳定性改进 2、用户体验2.1 改进的全行代码补全2.2 新 UI 成为所有用户的默认界面2.3 Search E…

C++模拟实现vector容器【万字模拟✨】

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; 学习专栏C语言_Stark、的博客-CSDN博客 项目实战C系列_Stark、的博客-CSDN博客 数据结构与算法_Stark、的博客-CSDN博客 座右铭&#xff1a;梦想是一盏明灯&#xff…

设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)

文章目录 设计模式概述1、原型模式2、原型模式的使用场景3、优点4、缺点5、主要角色6、代码示例7、总结题外话关于使用序列化实现深拷贝 设计模式概述 创建型模式&#xff1a;工厂方法、抽象方法、建造者、原型、单例。 结构型模式有&#xff1a;适配器、桥接、组合、装饰器、…

深度学习中的结构化概率模型 - 结构化概率模型的深度学习方法篇

序言 在深度学习的广阔领域中&#xff0c;结构化概率模型&#xff08; Structured Probabilistic Model \text{Structured Probabilistic Model} Structured Probabilistic Model&#xff09;扮演着至关重要的角色。这类模型利用图论中的图结构来表示概率分布中随机变量之间的…

Spring Boot ⽇志

目录 1.⽇志使⽤ 2.⽇志级别 3.⽇志配置 3.1配置⽇志级别 3.2⽇志持久化 3.3配置⽇志⽂件分割 4.更简单的⽇志输出 1.⽇志使⽤ 在使用之前我们先来了解一下为什么要使用&#xff1f; ⽇志的⽤途 1.系统监控 我们可以通过⽇志记录这个系统的运⾏状态&#xff0c;对数…

20款奔驰CLS300升级原厂抬头显示HUD 23P智能辅助驾驶 触摸屏人机交互系统

以下是为您生成的一份关于 18 款奔驰 CLS 老款改新款的改装文案&#xff1a; 18 款奔驰 CLS 老款改新款&#xff1a;科技升级&#xff0c;畅享极致驾驶体验 在汽车改装的世界里&#xff0c;每一次的升级都是对卓越的追求。今天&#xff0c;让我们一同探索 18 款奔驰 CLS 老款改…

在登陆功能中添加Redis缓存

目录 基于Redis实现短信登录 实现流程图 实现代码 解决登录状态刷新问题 初始方案思路&#xff1a; 实现代码 发送验证码 登陆实现 如果是新用户则自动创建 运行测试 基于Redis实现短信登录 实现流程图 实现代码 Overridepublic Result login(LoginFormDTO loginForm…

Thinkphp/Laravel旅游景区预约系统的设计与实现

目录 技术栈和环境说明具体实现截图设计思路关键技术课题的重点和难点&#xff1a;框架介绍数据访问方式PHP核心代码部分展示代码目录结构解析系统测试详细视频演示源码获取 技术栈和环境说明 采用PHP语言开发&#xff0c;开发环境为phpstudy 开发工具notepad并使用MYSQL数据库…

【深度学习】— 多层感知机介绍、 隐藏层、从线性到非线性、线性模型的局限性

【深度学习】— 多层感知机介绍 4.1 多层感知机4.1.1 隐藏层线性模型的局限性引入隐藏层 4.2 从线性到非线性线性组合的局限性引入非线性堆叠更多隐藏层 4.1 多层感知机 在第 3 节中&#xff0c;我们介绍了 softmax 回归&#xff0c;并实现了其从零开始的实现和基于高级 API 的…

如何在dblp官网下载外文文献

文章目录 零、dblp官网一、直接下载pdf二、Zotero 零、dblp官网 ①老域名&#xff1a;https://dblp.uni-trier.de/ ②简化域名&#xff1a;dblp.org 一、直接下载pdf 1.举例&#xff0c;搜索 image matching 2.直接点击红色的PDF按钮 (可能会因为卡&#xff0c;点了没反应。…

No.3 笔记 | Web安全基础:Web1.0 - 3.0 发展史

大家好&#xff01;作为一个喜欢探索本质的INTP&#xff0c;我整理了一份简明易懂的Web安全笔记。希望能帮助你轻松掌握这个领域的核心知识。 这份笔记涵盖了Web发展的历程&#xff0c;从静态的Web 1.0到智能化的Web 3.0。我们将探讨URL和HTTP协议&#xff0c;揭示它们在网络中…

24-10-2-读书笔记(二十二)-《契诃夫文集》(一)上([俄] 契诃夫 [译] 汝龙)啊!真想生活。

文章目录 《契诃夫文集》&#xff08;一&#xff09;上&#xff08;[俄] 契诃夫 [译] 汝龙 &#xff09;早期生活——塔甘罗格&#xff08;人物家庭简介&#xff09;学生时期——莫斯科&#xff08;写作与学习&#xff09;流浪时期——哈萨林&#xff08;游历与流浪&#xff09…

Java中的封装、继承、多态

目录 封装 概念 包 继承 多态 向上转型 一、直接赋值 二、方法传参 三、返回值 向上转型注意事项 向下转型 格式 重写 重写和重载的区别 动态绑定 静态绑定和动态绑定 封装 概念 简单来说就是套壳屏蔽细节。 举例&#xff1a; 想要访问它们时需要一些“接口”…

Java项目实战II基于Java+Spring Boot+MySQL的大创管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 在当前创新创业氛围浓厚的背景下&#xff0c;大学生创新创业项目&#xff08;简称“大创”&#xff0…

国内旅游:现状与未来趋势分析

在当今社会快速发展的背景下&#xff0c;国内旅游更是呈现出蓬勃的发展态势。中国&#xff0c;这片拥有悠久历史、灿烂文化和壮丽山河的广袤土地&#xff0c;为国内旅游的兴起与发展提供了得天独厚的条件。 本报告将借助 DataEase 强大的数据可视化分析能力&#xff0c;深入剖…

基于SpringBoot的学习资源共享平台

运行环境: jdk8tomcat9mysqlIntelliJ IDEAmavennodejs 设计选用前后端分离的单体架构方式 后端&#xff1a;SpringBootMybatis-PluslogbackElasticsearchRedisMySQLJwtsmtp阿里云OSS 前端&#xff1a;WebPackVueJsAnt Designaxios 主要模块&#xff1a;反馈管理、资源管理、…