base64编码原理

引出

众所周知, ASICC编码共127个, 使用了7个bit进行编码. 而文件在存储的时候是以 字节为单位, 也就是8bit. 这就难免导致有一部分编码是没有定义在ASICC编码中的.

而在网络中传输二进制数据的时候(字符串本质上也是二进制数据嘛), 如果直接传输比特流, 倒也不是不可以, 只是肉眼难以识别造成不便. 比如你在调试HTTP接口的时候, 对面传输的是一段字符串, 你抓包看到的都是一堆方块, 什么心情. 而且一些特殊的编码会影响对数据的解析, 造成解析错误.

ASICC编码是最通用的, 故而需要有一种机制, 能够将二进制数据转换为可见的ASICC编码字符串进行传输, 等到需要的时候, 再通过解码原封不动的转回去. 而这, 就是base64编码了.

实施

如何做到将二进制数据转换为可见的ASICC编码字符串呢?

选出可见字符

首先, 要先选出使用的可见ASICC编码, 从base64的名字也能看的出来, 一共选了64个, 分别是:
a-z A-Z 0-9 + /

好, 现在已经将使用的64个可见字符选出来了, 可以进行编码转换了.

64个字符一一映射后可编码6bit, 其编码映射表如下:

image-20220326114753764

也就是说, 原内容的6bit, 编码后为8bit. 没错, 会增加内容的大小.

编码步骤

我们尝试着对字符串hjn进行编码.

通过查询ASICC 编码表将其转为二进制:

01101000 01101010 01101110 共3个字节.

然后将其拆分为每6bit 一组:

011010 000110 101001 101110

将上方的6bit 二进制按照映射表进行转换, 结果为: aGpu. 使用PHP进行验证后, 结果与我们计算的一致.

<?php
// aGpu
echo base64_encode('hjn'), PHP_EOL;

补全码

我们再尝试对hj进行编码. 其二进制内容为: 01101000 01101010

按照6bit 分组后发现最后一组不足6bit, 就在后面补0: 011010 000110 101000

映射后, 其结果为: aGo. 但是, base64规定其必须是4字节一组, 当不足4字节时向后面添加补全码进行对其. 这个补全码就是=

因此, hjbase64编码为aGo=. 同理, 若仅对h进行编码, 则结果为aA==

那么, 当对aGo=解码的时候, 将后面的补全码=去掉, 解码后为: 011010 000110 101000. 如何能够确定后面的两个00需要去掉呢? 很简单, 存储的时候以字节为单位, 当末尾剩余00不足1字节时, 说明是编码时额外加上的, 可以去掉.

应用场景

齐了, base64编码就这么点东西. 它可以应用到下列场景(暂时想到):

  • 网页显示图片, 使用base64编码图片
  • 数据中存在特殊符号, 影响解析, 使用base64将其编码为普通符号
    • xml 中的 value 存在 </xml>结束符号, 影响内容解析
    • 传输过程中, 字符串中存在\n换行符, 影响单行内容传输
    • 等等
  • 等等吧

对了, 上面介绍了base64编码. 相对应的base32 base16编码原理均相同, 只是编码时使用的位数不同而已.

原文地址: https://hujingnb.com/archives/760

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

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

相关文章

页面加载速度-合并资源文件

前言 一直觉得自己的博客站点页面加载很慢, 就想着去优化一下. 呐, 下图是一次文章页面的加载, 需要2.5s. 其中 js 文件就有18个. 众所周知, 浏览器对资源文件的并行下载数量是有限制的(不同浏览器限制不同). 也就是说, 这18个 js 文件是无法同时下载的, 再说了, 页面中还有其…

hbase/thrift/go连接失败

问题 在通过Go连接hbase的过程中, 发现 get操作可以查到数据, 但是scanner命令访问数据失败, 也没有报错, 就是单纯的查不到数据. 而且Python PHP都一切正常. 这里简单复述一下我出现问题的情况, 安装过程和网上大部分内容一致, 这里简单列一下, 只是为了查询问题时参考安装过…

printf缓冲区踩坑

问题 碰到了这样一段代码(经过简化的): #include "stdio.h" #include "unistd.h" #include "sys/wait.h"int main(){fork();printf("1\n");fork();printf("1\n");wait(NULL);return 0; }这里我们简单算一下, 结果会打印几…

进程切换时是如何保存上下文的

前言 当前操作系统大部分采用分时的进程调度, 既每个进程运行一小段时间, 然后切换到下一个进程运行, 依次往复. 当进程运行的时候是独占CPU的, 此时操作系统是无法强行介入的, 为了将执行权让出来, 就需要硬件的配合了. 硬件每个一个时钟周期(比如10ms), 就会产生一个时钟中…

GO/testing包

前言 之前在写GO单元测试的时候, 使用了这个结构testing.T. 进来无事翻了翻, 发现testing包中还有一些其他的结构体, 想来是不同用处. 没想到GO的testing包竟然默默做了这么多支持, 之前竟然不知道. 在testing包中包含一下结构体: testing.T: 这就是我们平常使用的单元测试t…

CPU的分支预测

前言 最近在进行性能调优的时候, 碰到了这样的一段代码(为了展示问题而简化的代码): <?php // 第一次运行 $start microtime(true); for ($i 0; $i < 100; $i) {for ($j 0; $j <1000; $j) {for ($k 0;$k < 10000; $k) {}} } $end microtime(true); echo fi…

PHP获取Opcode及C源码

是什么 在开始之前, 必须要先介绍一下Opcode是什么. 众所周知, Java在执行的时候, 会将.java后缀的文件预先编译为.class字节码文件, JVM加载字节码文件进行解释执行. 而字节码文件存在的意义, 就是为了加速执行. 那么PHP的Opcode与之类似, 也是从.php文件到执行的过程中, 所…

PHP require/include 区别

前言 在PHP中, 载入文件可以选择使用require, 也可以使用include, 那么那他们有什么区别呢? 看了网上的一些文章, 说他们使用场景不同, require一般在文件开头引入文件, include一般在函数中动态引入文件. 但是我觉得并不是这么简单, require是作为语言结构(关键字)出现的, …

Golang 接口原理

问题 小提示, 若想直接查看原理, 可从接口原理开始查看. 有这样一段GO代码: func main() {var obj interface{}fmt.Printf("obj nil. %b\n", obj nil)type st struct{}var s *stobj sfmt.Printf("s nil. %b\n", s nil)fmt.Printf("obj nil. …

三星识别文字_比亚迪电子助力三星Galaxy Note 10系列霸气首发!

三星有子初长成气宇轩昂 秀美俊逸减之一分则嫌柔增之一分则嫌赘2019年8月7日于纽约巴克莱发布Galaxy Note 10系列用简约 重构美三星Galaxy Note 10与Galaxy Note 10分别搭载了6.3英寸和6.8英寸的超感官全视曲面屏&#xff0c;均采用单摄挖孔屏&#xff0c;开孔位于屏幕正上方。…

lisp 设计盘形齿轮铣刀_机械设计基础——周转轮系传动比的计算

点击上方蓝色字体&#xff0c;关注我们15(视频来源于网络&#xff0c;仅供学习交流&#xff0c;侵权请联系删除)机械计重点学习指导机械原理全书重点提要轴的结构改错机械设计作业集01机械设计作业集02机械设计作业集答案机械原理作业集机械原理作业集答案轴的强度计算院校推荐…

b+树阶怎么确定_B站公布年度弹幕,这个排名我不太服气

也忘记了是从什么时候开始&#xff0c;B站开始公布自己的年度弹幕了&#xff0c;今年的年度弹幕排名前五的分别是&#xff1a;爷青回、武汉加油、有内味了、双厨狂喜、禁止套娃。话说今年真的是不容易啊&#xff0c;过年那段时间以及上半年不会忘记那一幕幕感人深邃的瞬间&…

css打印适应纸张_从生态平衡到打印机故障分析

生态平衡(ecological equilibrium)是指在一定时间内生态系统中的生物和环境之间、生物各个种群之间&#xff0c;通过能量流动、物质循环和信息传递&#xff0c;使它们相互之间达到高度适应、协调和统一的状态。也就是说当生态系统处于平衡状态时&#xff0c;系统内各组成成分之…

html5调用系统声音1s响一次_20款奔驰GLC260提车改柏林之声音响,音乐诉请,为爱发声!...

奔驰GLC车型在2020上半年可谓是风生水起&#xff0c;尤其是2020年1-5月份的豪华品牌SUV排名中&#xff0c;奔驰GLC车型以58982的销售量遥遥领先&#xff0c;同比增长了2%&#xff0c;奔驰GLC5月销量高达15275辆&#xff0c;再次打败老对手奥迪Q5L&#xff0c;夺得豪华SUV销量冠…

kotlin将对象转换为map_将网站转换为Photoshop文档

WebToLayers是一款能够帮助大家将网页转换成图像格式的软件&#xff0c;能够Web页面转换成PNG&#xff0c;JPG以及PSD格式的图片。当网页转换为PSD的时候&#xff0c;网页的各个要素都会自动转换为相应的图层&#xff0c;使得大家能够对PSD格式的网页进行设计与管理。WebToLaye…

centos更换网卡后怎么更新配置_CentOS安装

服务器使用的Linux操作系统都使用了CentOS来进行安装&#xff0c;CentOS是一个开源的Linux发行版&#xff0c;具有很好的稳定性和更多的可扩展行。为了能够正常使用Docker&#xff0c;我们将使用CentOS7及以上版本。​下载地址&#xff1a;https://www.centos.org/download/ ​…

centos普通用户修改文件权限_Linux实战014:Centos创建用户并添加root授权

刚收到在腾讯云申请的云服务器8台&#xff0c;现在准备分配给不同项目组来使用。为了确保系统及账号的安全&#xff0c;root账号不能直接给到他们。因为root的权限太大&#xff0c;任何的误操作就可能导致系统异常或者数据丢失找不回来。而且我们这是生产环境&#xff0c;账号会…

mongodb 导出txt_(干货)前端实现导出excel的功能

前言 导出功能其实在开发过程中是很常见的,平时我们做导出功能的时候基本都是后台生成&#xff0c;我们直接只需要调一支接口后台把生成的文件放到服务器或者数据库mongodb中,如果是放到mongodb中的话,我们需要从mongodb中通过唯一生成的id去拿到文件,最后window.location.href…

1971旗舰cpu intel_CPU的历史

很多人都对电脑硬件有一点的了解&#xff0c;本人也算略懂一二&#xff0c;所以今天来为大家说说电脑的主要硬件之一––CPU(中央处理器)。那么我们知道世界上造CPU的公司主要就是Intel和AMD。其实仔细想想&#xff0c;CPU的主要成分是什么?是硅(Si)&#xff0c;硅从那里来&am…

文本显示变量_【RPA课堂】UiPath中的变量、数据类型和组件

自动化出现的那一天起&#xff0c;就有了各种各样的工具来满足自动化的需要。无论是用于windows桌面自动化的简单工具&#xff0c;还是用于企业自动化大量任务的工具&#xff0c;它们都有自己的功能。UiPath就是这样的工具&#xff0c;在本文中&#xff0c;我们介绍一些非常基本…