Base64 百科词条

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个位元为一个单元,对应某个可打印字符。三个字节有24个位元,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。

Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email,email via MIME,在XML中存储复杂数据.

目录

  • 1MIME
    • 1.1例子
  • 2UTF-7
  • 3IRCu
  • 4在URL中的应用
  • 5其他应用
  • 6外部链接
  • 7参见

MIME

在MIME格式的电子邮件中,base64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本。使用时,在传输编码方式中指定base64。使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途。

完整的base64定义可见RFC 1421和RFC 2045。编码后的数据比原始数据略长,为原来的\frac{4}{3}。在电子邮件中,根据RFC 822规定,每76个字符,还需要加上一个回车换行。可以估算编码后数据长度大约为原长的135.1%。

转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6(因为2^6=64)个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。

当原数据长度不是3的整数倍时, 如果最后剩下两个输入数据,在编码结果后加1个“=”;如果最后剩下一个输入数据,编码结果后加2个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。

例子

举例来说,一段引用自托马斯·霍布斯的利维坦的文句:

Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.

经过base64编码之后变成:

TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=
  • 编码“Man”
文本Man
ASCII编码7797110
二进制位010011010110000101101110
索引1922546
Base64编码TWFu

在此例中,Base64算法将三个字符编码为4个字符

Base64索引表:

ValueChar ValueChar ValueChar ValueChar
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行base64的编码。在编码后的base64文本后加上一个或两个'='号,代表补足的字节数。也就是说,当最后剩余一个八位字节(一个byte)时,最后一个6位的base64字节块有四位是0值,最后附加上两个等号;如果最后剩余两个八位字节(2个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。 参考下表:

文本(1 Byte)A  
二进制位01000001                
二进制位(补0)010000010000            
Base64编码QQ  
文本(2 Byte)BC 
二进制位0100001001000011  xxxxxx
二进制位(补0)010000100100001100xxxxxx
Base64编码QkM 

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持久化系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。

然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSISQL中已将“%”号用作通配符。

为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。

另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“*”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。

此外还有一些变种,它们将“+/”改为“_-”或“._”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。

其他应用

  • Mozilla Thunderbird和Evolution用Base64来保密电子邮件密码
  • Base64也会经常用作一个简单的“加密”来保护某些数据,而真正的加密通常都比较繁琐。
  • 垃圾讯息传播者用Base64来避过反垃圾邮件工具,因为那些工具通常都不会翻译Base64的讯息。
  • LDIF档案,Base64用作编码字串。

外部链接

  • RFC 1421(Privacy Enhancement for Electronic Internet Mail)
  • RFC 2045(MIME)
  • RFC 3548(The Base16, Base32, and Base64 Data Encodings)
  • Base64的解码器
  • Base64的编码器
  • Base64在线转换工具
  • Home of the Base64 specification, with an online decoder and C99 implementation
  • 不同编程语言/应用程式的源代码/工具:
    • C
    • Java
    • MIME::Base64 Perl module
    • Firefox extension
    • emacs函数

转自:http://zh.wikipedia.org/wiki/Base64

转载于:https://www.cnblogs.com/xieyuan/p/3787274.html

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

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

相关文章

java获取mysql执行计划_好程序员Java学习路线之MySQL的执行计划

好程序员Java学习路线之MySQL的执行计划。什么是执行计划?执行计划通常是开发者优化SQL语句的第一步。MySQL在解析SQL语句时,会生成多套执行方案,然后内部会进行一个成本的计算,然后通过优化器选择一个最优的方案执行,…

Web系统开发构架再思考-前后端的完全分离

前言 前后端完全分离其实一直是Web开发人员的梦想,也一直是我的梦想,遥想当年,无论是直接在代码里面输出HTML,还是在HTML里面嵌入各种代码,都不能让人感到满意.期间的痛苦和纠结,我想所有Web开发人员都深有感触. 由于最近几年一直在MS平台,从Web Form到MVC,MS平台虽然易用好学,…

C++程序设计基础

01 1 预编译常用的有&#xff0c;宏定义和包含库。2 库&#xff1a;是实用工具的集和&#xff0c;由程序员编写&#xff0c;可以完成一些特定的功能。3 <> 系统库 ""用户自定义库。4 宏定义&#xff1a;定义符号常量&#xff0c;符号常量就是给常量取的名字。常…

文科思维Java_开源之Processing:这好玩的编程语言是为文科生艺术家准备的

说起编程语言&#xff0c;我们很多时候第一反应就是很难&#xff0c;都是理工科计算机相关行业的人才学的&#xff0c;都是为理科生掉头发准备的。的确&#xff0c;计算机的严谨&#xff0c;注定要求开发应用的人有缜密的理工科的理性逻辑思维&#xff0c;然而一人客从另一方面…

第一章导言的笔记与思考

Writer&#xff1a;BYSocket&#xff08;泥沙砖瓦浆木匠&#xff09; 微博&#xff1a;BYSocket 豆瓣&#xff1a;BYSocket ~&#xff1a;较重要 ~~&#xff1a;重要 1.1 hello&#xff0c;world ~初学人来说还是一大障碍&#xff0c;手写编写程序文本&#xff0c;然后成功的进…

C 和 Object- C 中得 #ifdef 和#ifndef

很多宏是为了进行条件编译。一般情况下&#xff0c;源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译&#xff0c;也就是对一部分内容指定编译的条件&#xff0c;这就是“条件编译”。有时&#xff0c;希望当满足某条件时对一组语句进行编…

C语言基础小斋

一、C语言数据类型 ok&#xff0c;如我们所知&#xff0c;C语言作为大学工科专业的必学课程&#xff0c;其重要性不言而喻&#xff1b;它为我们提供了丰富的数据类型&#xff0c;所以它很适合程序员来编写 数据库 &#xff0c;如DB2、Oracale都是C语言编写的。 那么C语言具体又…

《Cracking the Coding Interview》——第11章:排序和搜索——题目8

2014-03-21 22:23 题目&#xff1a;假设你一开始有一个空数组&#xff0c;你在读入一些整数并将其插入到数组中&#xff0c;保证插入之后数组一直按升序排列。在读入的过程中&#xff0c;你还可以进行一种操作&#xff1a;查询某个值val是否存在于数组中&#xff0c;并给出这个…

gradle打包java项目_gradle打包java项目

转载地址&#xff1a;http://www.gfzj.us/series/gradle/2014/12/12/gradle%E5%B0%8F%E7%B3%BB%E5%88%97(4)--gradle%E6%89%93%E5%8C%85java%E9%A1%B9%E7%9B%AE.html以gradle小系列所举例子为示例&#xff0c;在此处介绍两种gradle发布java项目的方法&#xff1a;fat jar方式该…

堡垒机2.0

一、编辑系统环境变量&#xff0c;让用户登录后自动调用脚本 1 vim /etc/profile 2 python /baolei/ssh_login.py 3 # 判断登录用户是否为 root 用户&#xff0c;root用户退出程序不进行logout操作&#xff0c;否则则logout 4 if [ $? ! 10 ];then 5 echo "Good …

Flex中利用ByteArray与BitmapData互相转换实现图片的二进制保存与复原

Flex中利用ByteArray与BitmapData互相转换实现图片的二进制保存与复原 近 日在项目当中需要将图片保存到共享对象当中&#xff0c;开始用了俩天的时间做了对象的序列化&#xff0c;并以BitmapData的形式进行了图片的序列化保存共享&#xff0c;因为系统 没有提供更好的接口所以…

java8自定义收集器_使用自定义收集器进行Java 8分组?

我有以下课程。class Person {String name;LocalDate birthday;Sex gender;String emailAddress;public int getAge() {return birthday.until(IsoChronology.INSTANCE.dateNow()).getYears();}public String getName() {return name;}}我希望能够按年龄分组&#xff0c;然后收…

poj 1862 Stripies/优先队列

原题链接&#xff1a;http://poj.org/problem?id1862 简单题&#xff0c;贪心优先队列主要练习一下stl大根堆 写了几种实现方式写成类的形式还是要慢一些。。。 手打的heap&#xff1a; 1&#xff1a; 1 #include<cstdio>2 #include<cstdlib>3 #include<cmath&…

java url下载ics_使用Microsoft Graph API处理外部(Internet / .ics)日历URL

在新的Graph API中&#xff0c;是否可以根据外部.ics日历网址为用户创建新日历&#xff1f;我d like to do is to use a daemon to inject a link to an external calendar into the list of calendars a user has if they don已经有了这样一个链接 . 这将有效地复制用户可以在…

命令行生成jar文件

1.打开cmd&#xff0c;进入编译完后所有类的当前目录 命令行 jar -cvf javaname.jar *.class 这时已经生成了 javaname.jar 不过如果有多个类&#xff0c;双击打不开 2.解压javaname.jar 进入META-INF&#xff0c;编辑MANIFEST.MF: 尾行写入Main-Class:&#xff08;&…

Github链接地址

https://github.com/kzj1/test转载于:https://www.cnblogs.com/lalal/p/4456923.html

java foreach和for循环区别_java相关:老生常谈foreach(增强for循环)和for的区别

java相关&#xff1a;老生常谈foreach(增强for循环)和for的区别发布于 2020-8-18|复制链接下面小妖就为大家带来一篇老生常谈foreach(增强for循环)和for的区别。小妖觉得挺不错的&#xff0c;现在就分享给大家&#xff0c;也给大家做个参考。一起跟随小妖过来看看吧首先说一下f…

关于事件冒泡和捕获的问题

由于习惯于jquery的方便操作&#xff0c;往往让我们慢慢淡忘了原生js应有的功能和属性&#xff0c;今天重温一下事件冒泡和捕获问题。 冒泡&#xff1a;从内向外&#xff0c;如&#xff1a;div > body > html (不同浏览器稍有不同) 捕获&#xff1a;从外向内&#xff0c;…

root无法运行命令解决办法

今天运行一个命令wget(wg再使用tab键无法使用)&#xff0c;如下提示 -bash: /usr/bin/wget: 权限不够 [rootwww /]# ls -Z /usr/bin/wget-rw-r--r--. root root system_u:object_r:bin_t:s0 /usr/bin/wget发现没有执行权限 chmod x /usr/bin/wget -bash: /usr/bin/wget: …

java类编写sql_用JavaBean编写SQL Server数据库连接类

以下为引用的内容&#xff1a;//类conn.db.conndb.javapackage conn.db;import java.sql.*;public class conndb {Connection conn;ResultSet rs;private int count;public conndb() {try {Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");} catch (Exception ex) {}…