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

news2024/12/24 2:30:21

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);
}

执行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据挖掘学习笔记:朴素贝叶斯 | Python复现

数据挖掘学习笔记:朴素贝叶斯 机器学习系列(四):朴素贝叶斯(华强买瓜版) - yyxy的文章 - 知乎 十分钟,让你再也忘不掉贝叶斯分类 - VoidHaruhi的文章 - 知乎 《机器学习》(西瓜书&am…

快速生成单元测试

1. Squaretest插件 2. 依赖 <dependency><groupId>junit</groupId>

Spring异步线程池的问题

今天看一视频&#xff0c;提到说 Spring默认的异步线程池比较简单&#xff0c;每次执行异步任务&#xff0c;都会新建一个线程进行处理&#xff0c;不会重复利用&#xff0c;所以在用Spring框架开发的时候&#xff0c;需要自定义异步线程池。第一次听到这个说法。遂开始百度。 …

迷你世界表白神器爱心脚本lua

--迷你世界专用爱心表达公式 local a,angle,count,id30,0,0,math.random(668, 681) -- 根据需要调整θ的遍历范围和步长 while true do angle angle0.01 local ra*(math.sin(angle)*(math.sqrt(math.abs(math.cos(angle)))/(math.sin(angle)1.4)-2)2) if r>10…

动手学深度学习59 双向循环神经网络

1. 双向循环神经网络 视频&#xff1a;https://www.bilibili.com/video/BV12X4y1c71W/?p2&spm_id_frompageDriver&vd_sourceeb04c9a33e87ceba9c9a2e5f09752ef8 课件&#xff1a;https://courses.d2l.ai/zh-v2/assets/pdfs/part-3_7.pdf 课本&#xff1a; https://zh-…

机器学习K近邻算法——分类问题K近邻算法示例

针对“数据8.1”&#xff0c;讲解分类问题的K近邻算法&#xff0c;以V1&#xff08;转型情况&#xff09;为响应变量&#xff0c;以V2&#xff08;存款规模&#xff09;、V3&#xff08;EVA&#xff09;、V4&#xff08;中间业务收入&#xff09;、V5&#xff08;员工人数&…

【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则

文章目录 C 继承详解&#xff1a;初阶理解与实战应用前言第一章&#xff1a;继承的基本概念与定义1.1 继承的概念1.2 继承的定义 第二章&#xff1a;继承中的访问权限2.1 基类成员在派生类中的访问权限2.2 基类与派生类对象的赋值转换2.2.1 派生类对象赋值给基类对象2.2.2 基类…

多端同步的收银系统源码

随着经济的不断发展&#xff0c;很多门店越来越趋向连锁品牌化&#xff0c;收银系统自然也成为很多连锁门店必不可少的软件工具。希望通过一套软件可以帮助门店解决门店线下销售、会员管理、连锁多门店管理、线下线上一体化、商品库存管理等难题实现降本增效&#xff0c;为了方…

MySQL连接查询:联合查询

先看我的表结构 emp表 联合查询的关键字&#xff08;union all, union&#xff09; 联合查询 基本语法 select 字段列表 表A union all select 字段列表 表B 例子&#xff1a;将薪资低于5000的员工&#xff0c; 和 年龄大于50 岁的员工全部查询出来 第一种 select * fr…

大模型微调技术之 LoRA:开启高效微调新时代

一、LoRA 简介 LoRA&#xff0c;即低秩适应&#xff08;Low-Rank Adaptation&#xff09;&#xff0c;是一种用于微调大型语言模型的技术&#xff0c;旨在以较小的计算资源和数据量实现模型的快速适应特定任务或领域。 LoRA 方法通过引入低秩近似的思想&#xff0c;对大型预训…

NFS共享文件系统(将文件目录挂载到别的机器上)

我们创建的磁盘是否都必须挂载到本机上&#xff1f;并不是。在 Linux 和其他操作系统中&#xff0c;有一种叫做 NFS&#xff08;网络文件系统&#xff09;的工具&#xff0c;它允许跨网络共享文件系统资源。通过使用 NFS&#xff0c;我们可以将多个客户端服务器的数据目录挂载到…

Java中常见的等待唤醒机制及实践

JDK自带的等待唤醒机制 在Java中&#xff0c;有一个JDK维度的等待唤醒机制。Object类的wait和notify,notifyAll 需要在synchronized同步代码块内并且对象必须获取到锁才能调用。否则会抛IllegalMonitorStateException异常。 当线程在尝试获取锁时失败&#xff0c;会被封装成节…

Mybatis-plus做了什么

Mybatis-plus做了什么 Mybatis回顾以前的方案Mybatis-plus 合集总览&#xff1a;Mybatis框架梳理 聊一下mybatis-plus。你是否有过疑问&#xff0c;Mybatis-plus中BaseMapper方法对应的SQL在哪里&#xff1f;它为啥会被越来越多人接受。在Mybatis已经足够灵活的情况下&…

《强烈推荐一个强大的书签管理工具》

在信息爆炸的时代&#xff0c;我们每天都会浏览大量的网页&#xff0c;收藏各种各样的书签。然而&#xff0c;随着书签数量的增加&#xff0c;管理起来也变得越来越困难。这时&#xff0c;一个强大的书签管理工具就显得尤为重要。今天&#xff0c;我要向大家推荐一款备受好评的…

EtherCAT学习笔记

文章目录 前言一、EtherCAT介绍二、EtherCA系统组成2.1 ESC(EtherCAT从站控制器)2.2 从站控制微处理器2.3 物理层器件2.4 其它应用层器件 三、EtherCAT数据帧结构3.1 寻址方式3.2 时钟3.3 通信模式 四、状态机和通信初始化五、应用层协议六、ESC概述6.1 EtherCAT从站控制芯片6.…

基于SpringBoot+Vue+MySQL的美食信息推荐系统

系统展示 用户前台界面 管理员后台界面 系统背景 在数字化时代&#xff0c;随着人们对美食文化的热爱与追求不断增长&#xff0c;美食信息推荐系统成为了连接食客与美食之间的重要桥梁。面对海量的美食信息&#xff0c;用户往往难以快速找到符合个人口味和需求的美食。因此&…

Java-数据结构-Lambda表达式 (✪ω✪)

文本目录&#xff1a; ❄️一、背景&#xff1a; ➷ 1、Lambda表达式的语法&#xff1a; ➷ 2、函数式接口&#xff1a; ❄️二、Lambda表达式的基本使用&#xff1a; ➷ 1、语法精简&#xff1a; ❄️三、变量捕获&#xff1a; ❄️四、Lambda在集合中的使用&#xff1a; …

Chromium 中js navigator对象c++实现分析

一、Navigator 对象 Navigator 对象包含有关浏览器的信息。 前端测试例子&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>接口测试</title> </head> <body><div id"example&q…

爱心表达公式

脚本公式 local r (math.sin(angle) * math.sqrt(math.abs(math.cos(angle)))) / (math.sin(angle) 1.4) - 2 * math.sin(angle) 2

IOT-Tree连接西门子PLC S7 200 Smart竟然如此简单

最近一个项目需要把用户现场控制柜接入到云端&#xff0c;控制柜使用西门子PLC Smart 200 SR40型号&#xff0c;已经运行多年&#xff0c;PLC通过以太网接口对接一个触摸屏。 按照我以往的经验&#xff0c;觉得触摸屏以太网接口已经被占用&#xff0c;那么只能通过剩余的RS485…