Base64是一种使用64个基数的位置计数法。64个基数分别是A-Z、a-z和0-9(共62个),最后两个在不同的系统中具有一定的差别(MIME电子邮件中用加号「+」,斜杠「/」)。一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。
MIME
在MIME格式的电子邮件中,base64可以用来将二进制的字节序列数据编码成ASCII字符序列构成的文本。使用时,在传输编码方式中指定base64。使用的字符包括大小写字母各26个,加上10个数字,和加号「+」,斜杠「/」,一共64个字符,等号「=」用来作为后缀用途。
完整的base64定义可见 RFC1421和 RFC2045。编码后的数据比原始数据略长,为原来的4/3。在电子邮件中,根据RFC822规定,每76个字符,还需要加上一个回车换行。可以估算编码后数据长度大约为原长的135.1%。
转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,於緩衝區中剩下的bit用0补足。然后,每次取出6(因为26 = 64)个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。
如果最後剩下兩個輸入數據,在編碼結果後加1個「=」;如果最後剩下一個輸入數據,編碼結果後加2個「=」;如果沒有剩下任何數據,就什麼都不要加,這樣才可以保證資料還原的正確性。
一个例子
「M」的ASCII碼 = 77 = 01001101
「a」的 = 97 = 01100001
「n」的 = 110 = 01101110
將這三個字節拼合,得出一個24位的資料:
010011010110000101101110
現在六個一組的分開,這樣便得到六個數。將這些數轉為:
010011 = 19 = T (T是第20個英文字母,但从0开始计数)
010110 = 22 = W (W是第23個英文字母,但从0开始计数)
000101 = 5 = F (F是第6個英文字母,但从0开始计数)
101110 = 46 = u (U是第21個英文字母,但从0开始计数)
base64編碼是:
00010011
00010110
00000101
00101110
即是每3個未編碼字節,編碼後會得到4個字節。
-
例二,加密M:M=01001101,變成加密010011010000,六個一組分開是010011
010000,結果是TQ,然後在後面加兩個「=」,結果就是「TQ==」。
UTF-7
UTF-7 是一个修改的Base64(Modified Base64)。主要是将UTF-16的数据,用Base64的方法编码为可打印的 ASCII 字符序列。目的是传输 Unicode 数据。主要的区别在于不用等号"="补余,因为该字符通常需要大量的转译。
标准可见RFC 2152,《A Mail-Safe Transformation Format of Unicode》。
IRCu
在IRCu等软件所使用的P10 IRC服务器间协议中,对客户与服务器的消息类型号(client/server numerics)和二进制IP地址采用了base64编码。消息类型号的长度固定为3字节,故可直接编码为4个字节而不需要加填充。对IP地址进行编码时,则需要在地址前添加一些0比特,使之可以编码为整数个字节。这里所用的符号集与前述MIME的也有所不同,将+/改成了[]。
在URL中的应用
Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的「/」和「+」字符变为形如「%XX」的形式,而这些「%」号在存入数据库时还需要再进行转换,因为ANSI SQL中已将「%」号用作通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充'='号,并将标准Base64中的「+」和「/」分别改成了「*」和「-」,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
另有一种用于正则表达式的改进Base64变种,它将「+」和「/」改成了「!」和「-」,因为「+」,「*」以及前面在IRCu中用到的「[」和「]」在正则表达式中都可能具有特殊含义。
此外还有一些变种,它们将「+/」改为「_-」或「。_」(用作编程语言中的标识符名称)或「。-」(用于XML中的Nmtoken)甚至「_:」(用于XML中的Name)。
(注:本文参考了维基百科的文章,并在基础上进行了一定程度的修改,便于理解。具体内容基本出自维基百科,非本人所创)
分享到:
相关推荐
赠送jar包:base64-2.3.8.jar; 赠送原API文档:base64-2.3.8-javadoc.jar; 赠送源代码:base64-2.3.8-sources.jar; 赠送Maven依赖信息文件:base64-2.3.8.pom; 包含翻译后的API文档:base64-2.3.8-javadoc-API...
rhel-baseos-9.0-beta-0-x86_64-dvd.iso 网盘文件永久链接
javabase64-1.3.1.jar,RSA非对称加密算法中有需要用到,亲测可用
base64-stream, 包含用于编码/解码Base64数据的新 node v0.10样式流类 简介虽然 node.js 支持Base64数据,但它不具备在流中编码/解码数据的能力。这里库包含一个流Base64编码器和一个用于 node.js的流Base64解码器。...
赠送jar包:base64-2.3.8.jar; 赠送原API文档:base64-2.3.8-javadoc.jar; 赠送源代码:base64-2.3.8-sources.jar; 赠送Maven依赖信息文件:base64-2.3.8.pom; 包含翻译后的API文档:base64-2.3.8-javadoc-API...
javabase64-1.3.1.jar java用的base64加密解密工具包.其实很多依赖里面都带,比如shiro或者apache,如果没有其他的jar包的话可以下载我这个试试
nodejs的base64和aes-128-ecb加密.rar
javabase64-1.3.1.jar,有需要的,可以下载
javabase64-1.2.jar
base64-2.3.9.jar 架包 有需要使用自己下载base64-2.3.9.jar 架包 有需要使用自己下载
Laravel开发-base64-validation base64编码文件的laravel验证器
base64-2.3.8.jar
前端开源库-base64-loaderbase64加载程序,用于WebPack的base64文件加载程序
MIME-Base64-3.01.tar.gz
base64中文加密 注意中文编码为UTF-8
js-base64-3.7.5.tgz
离线安装包,亲测可用
C# Winform Base64加密解密,为程序源代码,可直接运行
base64-arraybuffer 将base64数据编码/解码为ArrayBuffers 入门 使用以下命令安装模块: npm install base64-arraybuffer 原料药 该库在与ArrayBuffers之间对base64进行编码和解码 encode(buffer) -将ArrayBuffer...