当前位置: 首页 > news >正文

BASE64编码通俗介绍

byte[]数组不利于文本方式传递,一般会进行文本化处理。常见的方式有转换为十六进制数列表和使用Base64编码两种。

十六进制数会将4bit转换为一个字符,而Base64能将6bit转换为一个字符。有时为了有效控制转换后文本的长度,在实际工作中会选用Base64编码。

传统的邮件只支持可见字符的传输,像ASCII码的控制字符就不能通过邮件传输。另外,图片二进制流的每个字节不可能全部都是可见字符,所以无法使用文本传输。

那么,如何解决该问题呢?

注:ASCII码包含了128个字符。其中,前32个为031,即0x000x1F,都是不可见字符。这些字符就是控制字符。

最好的方法就是在不改变传统协议的情况下,实现一种扩展方案。该方案将无法用文本表示的二进制编码转换为可见文本进行传输,从而解决相关问题,而Base64编码就是一种落地方案。

Base64是一种编码方式,这个术语是在“MIME内容传输编码规范”中提到的。Base64不是一种加密算法,实际上是一种“二进制转换到文本”的编码方式,将任意二进制数据转换为ASCII字符串的形式,以便在只支持文本的环境中也能顺利传输二进制数据。

Base64编码首先建立了如表1所示的Base64编码表,将数字0~63分别映射到64个不同的字符中。

索引对应字符索引对应字符索引对应字符索引对应字符
0A17R34i51z
1B18S35j520
2C19T36k531
3D20U37l542
4E21V38m553
5F22W39n564
6G23X40o575
7H24Y41p586
8I25Z42q597
9J26a43r608
10K27b44s619
11L28c45t62+
12M29d46u63/
13N30e47v
14O31f48w
15P32g49x
16Q33h50y
表1

由于 64个不同的字符,最多对应于64种不同的二进制编码,而6bit恰好有64种不同的二进制编码,因此Base64编码的每个字符表示一个6bit长度的二进制数。

在实际工作中,所有的二进制数都以Byte(8bit)为单位,所以要编码的二进制数的bit长度都是8的倍数;而Base64编码以6bit为单位,所以Base64能编码的二进制数的bit长度都要求为6的倍数。这就涉及补齐操作,即把8的倍数补齐到6的倍数。

在如表2所示的Base64编码示例中展示了一种完美情况。这时输入有3Byte,正好转换为4个Base64编码字符。

二进制位010011010110000101101110
索引1922546
Base64编码TWFu

表2

在其它不完美的情况下,需要将8的倍数的bit后面补0,一直补到bit的长度是6的倍数为止。综上所述,从8的倍数的bit补0到6的倍数的bit,只存在补“00”和“0000”两种情况。表3和表4所示为Base64补位示例,分别展示了补“00“和补”0000“的最简情况。

二进制位0100001001000011
二进制位(补0)010000100100001100
Base64编码QkM=

表3

二进制位01000001
二进制位(补0)010000010000
Base64编码QQ==

表4

通过补”00”或“0000”最终都能符合Base64的编码要求,在标准的Base64编码中又约定编码字符长度为4的倍数(契合表2中的完美模式)。因此,在补“00”时,添加 一个“=”补齐(见表3);在补“0000”时,添加两个“=”补齐(见表4)。

但是,“=”在实际的解码过程中是没有任何作用的,之所以用“=”,可能是考虑到多段编码后的Base64字符串拼起来也不会引用混淆。

以上便是标准的Base64编码过程(解决过程就是逆过程,此处省略),但是在实际应用中,由于Base64编码可能会出现在URL中,为了解决这种情况下导致的乱码问题,一般会使用URL安全(URL Safe)的Base64编码。

在标准的Base64编码过程中会出现字符“+”、“/”,“=”,其中“+”和“/”作为编码字符出现在编码表中,“=”作为填充字符。而这3个字符是URL不安全的,即出现在URL中时需要进行转义。所以URL安全的Base64编码直接用“-”代替“+”,用“_“代替”/“,并且不进行”=“补齐。这样得到的Base64编码就可以安全地出现在URL上。

注:

摘录自糜鹏程写的《OAuth2实战宝典》。

个人觉得是对Base64最易懂的中文版介绍,所以摘录了下来。

http://www.lryc.cn/news/590442.html

相关文章:

  • Towards Low Light Enhancement with RAW Images 论文阅读
  • 北京-4年功能测试2年空窗-报培训班学测开-第五十二天
  • linux服务器stress-ng的使用
  • WAMP允许远程访问
  • 30 天自制 C++ 服务器--Day3
  • 用python实现自动化布尔盲注
  • RHCSA(软链接与硬链接)
  • 高性能架构模式——高性能缓存架构
  • sqli-labs靶场通关笔记:第23关 注释符过滤
  • 二、CV_AlexNet
  • 81、面向服务开发方法
  • 关于SaaS业务模式及其系统架构构建的详细解析
  • 横向移动(下)
  • IPD-流程设计-TE角色说明书参考模板
  • 多维傅里叶变换性质与计算
  • CSS3动画基本使用——页面一打开盒子就从左边走向右边
  • 【尝试】本地部署openai-whisper,通过 http请求识别
  • C++-linux系统编程 11.常见问题与答案
  • 创建SprngBoot项目的四种方式
  • 降本增效利器:汽车制造中EtherCAT转PROFIBUS DP网关应用探析
  • 快速开发汽车充电桩的屏幕驱动与语音提示方案
  • 使用 SeaTunnel 建立从 MySQL 到 Databend 的数据同步管道
  • Mysql系列--1、库的相关操作
  • 在 IntelliJ IDEA 中添加框架支持的解决方案(没有出现Add Framework Support)
  • AI学习笔记三十一:YOLOv8 C++编译测试(OpenVINO)
  • 使用Telegraf从工业物联网设备收集数据的完整指南
  • Beautiful Soup(BS4)
  • ABP VNext + EF Core 二级缓存:提升查询性能
  • AI炒作,AGI或在2080年之前也无法实现,通用人工智能AGI面临幻灭
  • 【RTSP从零实践】13、TCP传输AAC格式RTP包(RTP_over_TCP)的RTSP服务器(附带源码)