Java Base64 编码

Base64 编码是一种常见的二进制到文本的编码方式,在 Java 中,它常用于加密、数据传输以及存储时的字符转换。Java 8 及以上版本提供了内置的 java.util.Base64 类,使得 Base64 编码和解码更加方便和高效。


目录

  1. Base64 编码简介
  2. Java Base64 API
  3. Base64 编码和解码示例
    • 基本 Base64 编码
    • URL Base64 编码
    • MIME Base64 编码
  4. Base64 常见实践
  5. Base64 最佳实践
  6. 小结
  7. 参考资料

Base64 编码简介

Base64 是一种用于表示二进制数据的编码方式,常用于:

  • 将二进制数据(如图片、文件)转换为文本格式,以便通过 JSON、XML、HTML 进行传输或存储。
  • 在 URL、Cookie、JWT 令牌等环境下使用。
  • 对数据进行简单的加密(但 Base64 不是加密算法,仅用于编码)。

Base64 将 3 个字节(24 位)的数据编码成 4 个 ASCII 字符,因此最终的 Base64 编码长度是原数据的 1.33 倍


Java Base64 API

Java 8 及以上版本提供了 java.util.Base64 类,该类包含 3 种基本编码器:

编码类型 说明
Base64.getEncoder() 标准 Base64 编码,适用于一般数据
Base64.getUrlEncoder() URL 安全的 Base64 编码,避免 +/ 在 URL 传输时的特殊含义
Base64.getMimeEncoder() 适用于 MIME 格式的编码,通常用于邮件和 XML 数据

此外,每个编码器都有对应的解码器,例如 Base64.getDecoder()Base64.getUrlDecoder()Base64.getMimeDecoder()


Base64 编码和解码示例

基本 Base64 编码

import java.util.Base64;public class Base64Example {public static void main(String[] args) {String original = "Hello, Base64 in Java!";// 编码String encoded = Base64.getEncoder().encodeToString(original.getBytes());System.out.println("Base64 编码: " + encoded);// 解码byte[] decodedBytes = Base64.getDecoder().decode(encoded);String decoded = new String(decodedBytes);System.out.println("Base64 解码: " + decoded);}
}

输出

Base64 编码: SGVsbG8sIEJhc2U2NCBpbiBKYXZhIQ==
Base64 解码: Hello, Base64 in Java!

URL Base64 编码

场景:用于 URL 参数、JWT 令牌等,避免 +/ 在 URL 传输时的特殊含义。

import java.util.Base64;public class UrlBase64Example {public static void main(String[] args) {String url = "https://example.com/?query=hello+world";// 编码String encodedUrl = Base64.getUrlEncoder().encodeToString(url.getBytes());System.out.println("URL 安全 Base64 编码: " + encodedUrl);// 解码byte[] decodedBytes = Base64.getUrlDecoder().decode(encodedUrl);String decodedUrl = new String(decodedBytes);System.out.println("URL 安全 Base64 解码: " + decodedUrl);}
}

输出

URL 安全 Base64 编码: aHR0cHM6Ly9leGFtcGxlLmNvbS8_cXVlcnk9aGVsbG8rd29ybGQ=
URL 安全 Base64 解码: https://example.com/?query=hello+world

MIME Base64 编码

场景:适用于电子邮件、XML 数据,支持每 76 个字符换行。

import java.util.Base64;public class MimeBase64Example {public static void main(String[] args) {String longText = "This is a long text that should be split into multiple lines when encoded using MIME Base64.";// 编码String encodedMime = Base64.getMimeEncoder().encodeToString(longText.getBytes());System.out.println("MIME Base64 编码: \n" + encodedMime);// 解码byte[] decodedBytes = Base64.getMimeDecoder().decode(encodedMime);String decodedMime = new String(decodedBytes);System.out.println("MIME Base64 解码: " + decodedMime);}
}

输出

MIME Base64 编码:
VGhpcyBpcyBhIGxvbmcgdGV4dCB0aGF0IHNob3VsZCBiZSBzcGxpdCBpbnRvIG11bHRpcGxlIGxpbmVzIHdoZW4gZW5jb2RlZCB1c2luZyBNSU1FIEJhc2U2NC4=MIME Base64 解码: This is a long text that should be split into multiple lines when encoded using MIME Base64.

Base64 常见实践

  1. 避免使用 Base64 进行加密

    • Base64 只是编码,不是加密,不能提供安全性。
    • 如果需要安全存储或传输数据,请使用 AES、RSA 等加密算法。
  2. 处理 Base64 编码带来的长度增加

    • Base64 会增加 约 33% 的数据大小,可能影响网络带宽和存储效率。
  3. 在网络传输时,优先使用 URL Base64

    • 避免 +/ 导致 URL 解析问题。
  4. 处理 Base64 的换行符

    • Base64.getMimeEncoder() 适用于需要换行的情况,如电子邮件和 XML。
    • 一般情况下,使用 Base64.getEncoder() 避免换行问题。

Base64 最佳实践

需求 适用编码器
一般数据编码 Base64.getEncoder()
URL 参数、JWT 令牌 Base64.getUrlEncoder()
电子邮件、XML 数据 Base64.getMimeEncoder()
处理二进制数据 先转换为 byte[],再进行 Base64

小结

  • Base64 是一种常见的 二进制到文本 编码方式,适用于数据存储、网络传输等场景。
  • Java 8 提供了 Base64 API,包括 标准编码、URL 安全编码、MIME 编码 三种方式。
  • Base64 不是加密方法,不能用于数据安全存储。
  • 选择适合的 Base64 编码方式可提高数据传输的可靠性和效率。

参考资料

  • Java 官方 Base64 文档
  • RFC 4648 - Base64 Data Encodings

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

photoshop 色彩平衡工具

色彩平衡工具作用于单个像素。 在不勾选保持明度的情况下,加红减青相当于直接增加像素的R值。相应的,加青减红相当于等比例降低G和B。 其他两项亦然。 也就是说,加红相当于直接在R通道上拉曲线。在勾选保持明度的情况下,加红减青会增加R值,降低G和B以保持明度不变。推测此…

从零到一打造商用AIAgent

这篇内容将从整体上介绍打造 AI Agent 的七个步骤,分别是需求梳理、软件选型、提示工程、数据库、构建 UI 界面、测试评估和部署发布。 梳理工作流 第一步,我们需要做的工作就是梳理需求。 首先,我们需要明确,做这个 AI Agent 是为了帮我们解决什么问题?如果你是一位自媒…

[AI/AIGC/LLM] 通义千问QwQ-32B: 阿里巴巴开源的、最新最强开源(推理)大模型 | Apache 2.0

序:2025年3月6日凌晨,阿里巴巴发布并开源全新的推理模型通义千问QwQ-32B。 通过大规模强化学习,千问QwQ-32B在数学、代码及通用能力上实现质的飞跃,整体性能比肩DeepSeek-R1。 在保持强劲性能的同时,千问QwQ-32B还大幅降低了部署使用成本,在消费级显卡上也能实现本地部署…

The Vendi Score: A Diversity Evaluation Metric for Machine Learning 论文笔记

介绍 我们基于生态学和量子统计力学的思想,提出了 Vendi 分数用来解决多样性评估问题 Vendi 分数不需要参考数据集或样本或标签的分布,因此它是通用的,适用于任何可以定义相似性的领域的生成模型、解码算法和数据集 创新 之前的多样性指标的适用性可能受到限制,因为它们需要…

MM-LLMs: Recent Advances in MultiModal Large Language Models 论文笔记

介绍 这是一篇多模态大模型的综述 MM-LLM面临的核心挑战是如何有效地将LLM与其他模式的模型连接起来以实现协作推理 建立了一个网站(https://mm-llms.github.io)来跟踪MM-LLM的最新进展并方便大家更新 模型架构冻结部分不可训练,未冻结部分是可训练的Modality Encoder:对不…

Root cause detection in a service-oriented architecture 论文笔记

背景 MonitorRank 是最早使用随机游走的策略定位故障根因服务的方法,MonitorRank 把系统的服务分成三类:前端服务:负责接收用户的请求以及进一步调用下游请求以完成用户的请求。 应用服务:负责真正处理用户请求的逻辑。 数据服务:负责提供经过包装的数据。(应用服务和数据…

MM-LLMS 论文笔记

介绍 这是一篇多模态大模型的综述 MM-LLM面临的核心挑战是如何有效地将LLM与其他模式的模型连接起来以实现协作推理 建立了一个网站(https://mm-llms.github.io)来跟踪MM-LLM的最新进展并方便大家更新 模型架构冻结部分不可训练,未冻结部分是可训练的Modality Encoder:对不…

MonitorRank 论文笔记

背景 MonitorRank 是最早使用随机游走的策略定位故障根因服务的方法,MonitorRank 把系统的服务分成三类:前端服务:负责接收用户的请求以及进一步调用下游请求以完成用户的请求。 应用服务:负责真正处理用户请求的逻辑。 数据服务:负责提供经过包装的数据。(应用服务和数据…

MicroRank 论文笔记

任务 异常检测->根因定位(服务实例级别)(针对延迟问题) 贡献MicroRank 是第一种通过正常和异常trace提取信息来对微服务应用程序进行根本原因定位的方法 我们提出了一种基于扩展频谱分析的微服务环境中新颖的根本原因定位方法 我们将 OpenTelemetry trace API 纳入 Goog…

Log3T 论文笔记

挑战 ① 基于可用日志先验知识设计的日志解析器性能有限,且不具有泛化性 ② 一些日志解析器在日志本身差异性大时无法正常工作 ③ 劳动密集型模型调整 框架离线训练 使用 WordPiece 进行 Tokenization(子词模型),然后输入到 Transformer 中进行上下文特征集成,然后输入 si…

软件工程-作业2:第一次个人编程作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023这个作业在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13324这个作业的目标 系统化流程地完成软件开发,使用性能测试工具和单元测试以优化…

LLaVA 论文笔记

介绍 提出了 visual instruction-tuning,这是将指令微调扩展到多模态的首次尝试 相关工作 多模态的指令微调 Agent、指令微调 数据 使用 ChatGPT/GPT-4 来将数据转化为 multimodel instrustion-following data 为每一个图像生成三种 mulmodal instruction-following data,对于…