浅谈Base64编码原理

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于 2的6次方是64,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。在MIME格式中,剩余两个字符是加号+和斜杠/,等号=用来作为后缀用途。UTF-7是一个修改版Base64,主要的区别在于不用等号=补余,因为该字符通常需要大量的转译。在IRCu等软件所使用的P10 IRC服务器间协议中,将+/改成了[]。Base64编码可用于在HTTP环境下传递,不在末尾填充=号,并将标准Base64中的+和/分别改成了-和_。

base64的原理

base64编码后的数据比原始数据略长,比原来长1/3。为什么会长1/3?我们学习下原理,之后工作中base64就再也不会挡道了。转换的时候,将3字节的数据,先后放入一个24位的缓冲区中,先来的字节占高位。数据不足3字节的话,于缓冲器中剩下的比特用0补足。每次取出6比特,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出,直到全部输入数据转换完成。若原数据长度不是3的倍数时且剩下1个输入数据,则在编码结果后加2个=;若剩下2个输入数据,则在编码结果后加1个=。换句话,本来3个字节,base64经过自己的编码成为4个字节。比原理多了1/3。来,举个例子

文本 h e l
ascii 编码 104 101 108
二进制 01101000 01100101 01101100
base64 6位 011010 00 0110 010101 101100
base64 10进制编号 26 6 21 44
base64 结果 a G V s

hel的base64编码结果就是aGVs

base64码表

base64的应用

base64的应用特别广泛,个人在开发中遇到最多的两个方面,第一个是URL的base64,另一个是图片base64。先说第一种,已经有urlencode了,为什么还需要base64 的URL。各有用途。urlencode是将-_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。如果一个URL里面有+ 有空格,是不是urlencode就搞不定,使用base64就会迎刃而解。带来的代价就URL比原理长了1/3

图片编码的问题,经常跟客户端开发的时候,客户端使用二进制流上传图片的时候比较复杂,就可以使用base64将图片的二进制编码转成base64,服务端接到数据之后再basedecode之后就是图片的二进制流。特别方便,带来的结果就是,传输的数据多了1/3。

遇到的问题

根据RFC 822规定,每76个字符,还需要加上一个回车换行。出问题的一般都是822规定,有的语言,对base64decode的时候,发现有换行符就decode失败了,究其原因基本都市822规定,有很多换行,decode的时候解码失败,知道原因了就特别简单,将换行符\r|\r\n 替换成 空,再base64decode就可以了。

原创文章,作者:晴川运维,如若转载,请注明出处:https://baike.qcidc.com/9479.html

(0)
晴川运维晴川运维
上一篇 4天前
下一篇 4天前

相关推荐

  • 远程连接Linux服务器具体方法

    如何远程连接linux服务器?作为一款服务器级别的操作系统,linux充分考虑了远程登录的问题,无论是从linux、windows还是其他一些操作系统登录到linux都是非常方便的…

    Linux系统 2025年6月8日
  • DNS在什么场景下选择TCP与UDP协议

    DNS同时占用UDP和TCP端口53是公认的,这种单个应用协议同时使用两种传输协议的情况在TCP/IP栈也算是个另类。但很少有人知道DNS分别在什么情况下使用这两种协议。 TCP与…

    Linux系统 2025年6月8日
  • Linux mysql定时备份脚本

    在生产环境上,为了避免数据的丢失,通常情况下都会定时的对数据库进行备份,本篇文章重点为大家讲解一下 mysql定时备份具体方法。 1. 创建备份脚本 备份脚本: #!/bin/ba…

    Linux系统 2025年6月8日
  • Linux下安装Docker具体方法

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化,下面为大家分享一下Li…

    Linux系统 2025年6月12日
  • 如何在 Linux 上用 Fail2Ban 保护服务器免受暴力攻击

    linux 管理员的一个重要任务是保护服务器免受非法攻击或访问。 默认情况下,Linux 系统带有配置良好的防火墙,比如iptables、Uncomplicated Firewal…

    Linux系统 5天前
  • 详解Vim插件:Python-mode

    Python-mode 是一个 vim 插件,允许你在 vim 编辑器中使用工具:pylint, rope, pydoc, pyflakes, pep8, mccabe ,用来对 …

    Linux系统 2025年6月10日
  • Linux系统zypper命令使用实例

    zypper 是一个简单易用的命令行包管理器,它使用了一个软件包管理库叫做 libzypp 。Zypper 能够操作软件安装源 (比如 Build Service 或 标准 ope…

    Linux系统 2025年6月4日
  • SVN版本回退

    SVN是一款版本控制工具。相对于GitHub而言,SVN在使用上更为简化些,本篇文章重点为大家讲解一下SVN版本回退。 当我们想放弃对文件的修改,可以使用 SVN revert 命…

    Linux系统 5小时前
  • Linux su命令:用户间切换(包含su和su -的区别)

    su 是最简单的用户切换命令,通过该命令可以实现任何身份的切换,包括从普通用户切换为 root 用户、从 root 用户切换为普通用户以及普通用户之间的切换。 普通用户之间切换以及…

    Linux系统 2025年6月8日
  • 详解zookeeper ACL

    zookeeper 的 ACL(Access Control List,访问控制表)权限在生产环境是特别重要的。ACL 权限可以针对节点设置相关读写等权限,保障数据安全性。perm…

    Linux系统 2025年6月8日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注