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

news/2024/10/5 18:47:44 标签: java, 开发语言

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编码工具类)。

java">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 算法,对数据进行编码与解码。

java">/**
 * 使用 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 进行编码与解码。

java">/**
 * 使用 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 等) 进行编码与解码。

java">/**
 * 使用 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.niftyadmin.cn/n/5691154.html

相关文章

CSS相关属性和显示模式

1. CSS相关属性 1.1 常见控制属性 属性名 作用 案例 width 宽度 width : 100px; height 高度 height : 100px; background-color 背景色 background-color : red; 1.2 文字控制属性 属性名 作用 案例 font-size 字体大小 font-size:30px; font-weight 字体…

算法(食物链)

240. 食物链 题目 动物王国中有三类动物 A,B,C𝐴,𝐵,𝐶,这三类动物的食物链构成了有趣的环形。 A𝐴 吃 B𝐵,B𝐵 吃 C𝐶,C𝐶 吃 A𝐴。…

数据科学基础复习(简)

可视化、数据可视化 在狭义上,数据可视化是与信息可视化,科学可视化和可视分析学平行的概念,而在广义上数据可视化可以包含这3类可视化技术。 数据科学的主要任务 数据科学研究目的与任务 大数据及其运动规律的揭示从数据到智慧的转化数据…

Unity如何用代码让Project窗口聚焦到指定路径/文件/文件夹

前言: 当项目文件夹 路径越来越多越来越复杂越来越深的时候,要切换到某个目录总要点好多次;而且经常会有在几个频繁访问的目录之间跳来跳去的需求场景。 此时,可以考虑在顶部菜单栏加上快捷访问按钮,能够快速地在Proje…

DenseNet算法:口腔癌识别

本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 一 DenseNet算法结构 其基本思路与ResNet一致,但是它建立的是前面所有层和后面层的密集连接,它的另一大特色是通过特征在channel上的连接来实现特征重用。 二 设计理念 三…

Linux 生产者消费者模型

前言 生产者消费者模型(CP模型)是一种十分经典的设计,常常用于多执行流的并发问题中!很多书上都说他很高效,但高效体现在哪里并没有说明!本博客将详解! 目录 前言 一、生产者消费者模型 1.…

SM2无证书及隐式证书公钥机制签名和加密过程详解(三)

在对隐式证书ASN.1模板和生成过程进行说明后(SM2无证书及隐式证书公钥机制签名和加密过程详解(二)-CSDN博客),进一步介绍用于隐式证书编码的COER。 (3)COER编码 ASN.1模板可采用多种编码形式,如比较熟悉的…

华为仓颉语言入门(9):for-in表达式

for-in 表达式用于遍历序列,它会依次访问序列中的每个元素,直到遍历完成。它常用于处理列表、数组或其他集合类型,能够有效简化代码,减少重复劳动。其基本语法如下: for (循环变量 in 序列) {循环体 }在 for-in 表达式中,每次循环都会检查是否遍历了序列中的所有元素。如…