从原理上搞定编码– Base64编码「建议收藏」

从原理上搞定编码– Base64编码「建议收藏」开发者对Base64编码肯定很熟悉,是否对它有很清晰的认识就不一定了。实际上Base64已经简单到不能再简单了,如果对它的理解还是模棱两可实在不应该。大概介绍一下Base64的相关内容,花几分钟时间

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

 开发者对Base64编码肯定很熟悉,是否对它有很清晰的认识就不一定了。实际 上Base64已经简单到不能再简单了,如果对它的理解还是模棱两可实在不应该。大概介绍一下Base64的相关内容,花几分钟时间就可以彻底理解它。文 章下边贴了一个Base64的编解码器,方便阅读文章的同时来实验。

  一. Base64编码由来

  为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就 不能通过邮件传送。这样用途就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就传送不了。最好的方法就是在不改变传统协议的情 况下,做一种扩展方案来支持二进制文件的传送。把不可打印的字符也能用可打印字符来表示,问题就解决了。Base64编码应运而生,Base64就是一种 基于64个可打印字符来表示二进制数据的表示方法。

  二. Base64编码原理

  看一下Base64的索引表,字符选用了”A-Z、a-z、0-9、+、/” 64个可打印字符。数值代表字符的索引,这个是标准Base64协议规定的,不能更改。64个字符用6个bit位就可以全部表示,一个字节有8个bit 位,剩下两个bit就浪费掉了,这样就不得不牺牲一部分空间了。这里需要弄明白的就是一个Base64字符是8个bit,但是有效部分只有右边的6个 bit,左边两个永远是0。

从原理上搞定编码-- Base64编码「建议收藏」

  那么怎么用6个有效bit来表示传统字符的8个bit呢?8和6的最小公倍数 是24,也就是说3个传统字节可以由4个Base64字符来表示,保证有效位数是一样的,这样就多了1/3的字节数来弥补Base64只有6个有效bit 的不足。你也可以说用两个Base64字符也能表示一个传统字符,但是采用最小公倍数的方案其实是最减少浪费的。结合下边的图比较容易理解。Man是三个 字符,一共24个有效bit,只好用4个Base64字符来凑齐24个有效位。红框表示的是对应的Base64,6个有效位转化成相应的索引值再对应 Base64字符表,查出”Man”对应的Base64字符是”TWFU”。说到这里有个原则不知道你发现了没有,要转换成Base64的最小单位就是三个字节,对一个字符串来说每次都是三个字节三个字节的转换,对应的是Base64的四个字节。这个搞清楚了其实就差不多了。

从原理上搞定编码-- Base64编码「建议收藏」         从原理上搞定编码-- Base64编码「建议收藏」

  但是转换到最后你发现不够三个字节了怎么办呢?愿望终于实现了,我们可以用两 个Base64来表示一个字符或用三个Base64表示两个字符,像下图的A对应的第二个Base64的二进制位只有两个,把后边的四个补0就是了。所以 A对应的Base64字符就是QQ。上边已经说过了,原则是Base64字符的最小单位是四个字符一组,那这才两个字 符,后边补两个”=”吧。其实不用”=”也不耽误解码,之所以用”=”,可能是考虑到多段编码后的Base64字符串拼起来也不会引起混淆。由此可见 Base64字符串只可能最后出现一个或两个”=”,中间是不可能出现”=”的。下图中字符”BC”的编码过程也是一样的。

从原理上搞定编码-- Base64编码「建议收藏」

  三. 总结  

  说起Base64编码可能有些奇怪,因为大多数的编码都是由字符转化成二进制的过程,而从二进制转成字符的过程称为解码。而Base64的概念就恰好反了,由二进制转到字符称为编码,由字符到二进制称为解码。

  Base64编码主要用在传输、存储、表示二进制等领域,还可以用来加密,但是这种加密比较简单,只是一眼看上去不知道什么内容罢了,当然也可以对Base64的字符序列进行定制来进行加密。

  Base64编码是从二进制到字符的过程,像一些中文字符用不同的编码转为二 进制时,产生的二进制是不一样的,所以最终产生的Base64字符也不一样。例如”上网”对应utf-8格式的Base64编码是”5LiK572R”, 对应GB2312格式的Base64编码是”yc/N+A==”。

来源:http://www.cnblogs.com/luguo3000/p/3940197.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/167506.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 手眼标定算法Tsai-Lenz代码实现(Python、C++、Matlab)

    手眼标定算法Tsai-Lenz代码实现(Python、C++、Matlab)上一节介绍了手眼标定算法Tsai的原理,这一节介绍算法的代码实现,分别有Python、C++、Matlab版本的算法实现方式。该算法适用于将相机装在手抓上和将相机装在外部两种情况论文已经传到git上,地址:https://gitee.com/ohhuo/handeye-tsai如果你要进行手眼标定,可以参考我的其他文章:手眼标定-基础使用手眼标定-JAKA机械臂手眼标定-AUBO机械臂手眼标定-Aruco使用与相机标定手眼标定-注意事项Python版本使用前需要安装库:pip3

  • 计算机网络 — HTTP协议 和 HTTPS[通俗易懂]

    计算机网络 — HTTP协议 和 HTTPS[通俗易懂]1.了解HTTP协议1.1HTTP是什么HTTP(HyperTextTransferProtocol,超文本传输协议)是一种应用非常广泛的应用层协议.所谓“超文本”的含义,就是传输的内容不仅仅是文本(比如html,css这个就是文本),还可以是一些其他的资源,比如图片,视频,音频等二进制的数据1.2抓包工具的使用1.Fiddler的下载①可以直接在官网下载Fiddler官网地址②也可以直接进入fiddler搜索页2.Fiddl

    2022年10月16日
  • 字符串转整型c#_java字符串数组转字符串

    字符串转整型c#_java字符串数组转字符串在C++11中增加了string的字符串以及整数之间的转换函数标准增加了全局函数。std::to_stringstd::stoistd::stolstd::stoll用来将整型转换为字符串for(size_ti=0;i<14;i++){ stringfileName=”chID”+std::to_string(i)+”.hex”;}…

    2022年10月19日
  • python为什么叫爬虫_python根据句柄进行点击

    python为什么叫爬虫_python根据句柄进行点击Pywin32是一个Python库,为python提供访问WindowsAPI的扩展,提供了齐全的windows常量、接口、线程以及COM机制等等。1.通过类名和标题查找窗口句柄,并获得窗口位置和大小importwin32guiimportwin32apiclassname=”MozillaWindowClass”titlename=”百度一下,你就知道-MozillaFire…

    2022年10月11日
  • java虚拟机可以运行的文件_虚拟机的网络模型有

    java虚拟机可以运行的文件_虚拟机的网络模型有Java虚拟机中的内存模型?Java虚拟机运行时内存所有的类的实例(不包括局部变量与方法参数)都存储在Java堆中,每条线程有自己的工作内存(Java栈),不同线程之间无法直接访问对方工作内存中的变量。方法区用于存储被虚拟机加载的类信息、常量、static变量等数据,堆用于存储对象实例,比如通过new创建的对象实例就保存在堆中,堆中的对象的由垃圾回收器负责回收。Java栈用于实现方法调用,每次方法调用就对应栈中的一个栈帧,栈帧包含局部变量表、操作数栈、方法接口等于方法相关的信息,栈中的数据当没有引用指向

  • 第四章 对象、变量和常量

    第四章 对象、变量和常量

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号