Base64 编码介绍、Base64编码转换原理与算法_其它综合

Base64编码,是我们程序开发中经常使用到的编码方法。它是一种基于用64个可打印字符来表示二进制数据的表示方法。它通常用作存储、传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用作电子邮件标准)中一种可打印字符表示二进制数据的常见编码方法!它其实只是定义用可打印字符传输内容一种方法,并不会产生新的字符集!有时候,我们学习转换的思路后,我们其实也可以结合自己的实际需要,构造一些自己接口定义编码方式。好了,我们一起看看,它的转换思路吧!

Base64实现转换原理

它是用64个可打印字符表示二进制所有数据方法。由于2的6次方等于64,所以可以用每6个位元为一个单元,对应某个可打印字符。我们知道三个字节有24个位元,就可以刚好对应于4个Base64单元,即3个字节需要用4个Base64的可打印字符来表示。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中一般有所不同。但是,我们经常所说的Base64另外2个字符是:“+/”。这64个字符,所对应表如下。

编号 字符 编号 字符 编号 字符 编号 字符
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

Base64编码转换算法、转换原理

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

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

编码后的数据比原始数据略长,为原来的4/3。无论什么样的字符都会全部被编码,因此不像Quoted-printable 编码,还保留部分可打印字符。所以,它的可读性不如Quoted-printable 编码!

文本 M a n
ASCII编码 77 97 110
二进制位 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0
索引 19 22 5 46
Base64编码 T W F u

M的Ascii码是77,前六位对应值为19,对应base64字符是T,如此类推。其它字符编码就可以自动转换得到!我们看看另外不是刚好是3个字节的情况!

文本(1 Byte) A
二进制位 0 1 0 0 0 0 0 1
二进制位(补0) 0 1 0 0 0 0 0 1 0 0 0 0
Base64编码 Q Q = =
文本(2 Byte) B C
二进制位 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 x x x x x x
二进制位(补0) 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 x x x x x x
Base64编码 Q k M =

Base64转换代码实现

既然知道了方法,那么我们如果要自己写个简单转换,好像也是很容易的!下面,我写下我做转换php代码!

/**
 *base64编码方法、本方法只是做base64转换过程代码举例说明,通过该例子可以任意改造不同语言版
 *@author 程默
 *@copyright http://blog.chacuo.net
 *@param $src 原字符串
 *@return string base64字符串*
 */
function c_base64_encode($src)
{
	static $base="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

	////将原始的3个字节转换为4个字节
	$slen=strlen($src);
	$smod = ($slen%3);
	$snum = floor($slen/3);

	$desc = array();

	for($i=0;$i<$snum;$i++)
	{
		////读取3个字节
		$_arr = array_map('ord',str_split(substr($src,$i*3,3)));

		///计算每一个base64值
		$_dec0= $_arr[0]>>2;
		$_dec1= (($_arr[0]&3)<<4)|($_arr[1]>>4);
		$_dec2= (($_arr[1]&0xF)<<2)|($_arr[2]>>6);
		$_dec3= $_arr[2]&63;

		$desc = array_merge($desc,array($base[$_dec0],$base[$_dec1],$base[$_dec2],$base[$_dec3]));
	}

	if($smod==0) return implode('',$desc);

	///计算非3倍数字节
	$_arr = array_map('ord',str_split(substr($src,$snum*3,3)));
	$_dec0= $_arr[0]>>2;
	///只有一个字节
	if(!isset($_arr[1]))
	{
		$_dec1= (($_arr[0]&3)<<4);
		$_dec2=$_dec3="=";
	}
	else
	{
		///2个字节
		$_dec1= (($_arr[0]&3)<<4)|($_arr[1]>>4);
		$_dec2= $base[($_arr[1]&7)<<2];
		$_dec3="=";
	}
	$desc = array_merge($desc,array($base[$_dec0],$base[$_dec1],$_dec2,$_dec3));
	return implode('',$desc);
}

好了,通过这个例子,我想base64编码转换原理、算法有些了解了吧!它转换过程很简单,只需要做个映射表,然后将原先做一些移位运算就可以完成!我们通过该例子,是不是可以做个自己的base32这类的编码呢!欢迎朋友们交流!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索base64
编码
base64算法原理、base64编码算法、base64编码解码算法、base64编码原理、base64编码原理与应用,以便于您获取更多的相关知识。

时间: 2024-12-02 23:28:19

Base64 编码介绍、Base64编码转换原理与算法_其它综合的相关文章

UUencode 编码,UU编码介绍、UUencode编码转换原理与算法_其它综合

UUencode编码起先用在unix网络中,先是Unix系统下将二进制的资料借由uucp邮件系统传输的一个编码程式,也是一种二进制到文字的编码.不属于MIME编码中一员.它也是定义了用可打印字符表示二进制文字一种方法,并不是一种新的编码集合.主要解决,二进制字符在传输.存储中问题.它早期在电子邮件中使用较多,最近这些年来基本上被MIME 中Base64所取代了.E-mail中一般采用UU.MIME.BINHEX三种编码标准! 我想,了解下这种编码将二进制字符转换为可打印字符实现思路!对我们以后做

XXencode 编码,XX编码介绍、XXencode编码转换原理与算法_其它综合

Xxencode编码,也是一个二进制字符转换为普通打印字符方法.跟UUencode编码原理方法很相似,唯独不同的是可打印字符不同.通个UUencode编码,我们知道它有个缺点就是,64个可打印字符中,有很多的特殊字符.而XXencode编码方法,对64个原字符有做规范.这里它有跟Base64类型了.都有指定可打印字符范围.及编号.Xxencode编码在上世纪后期,IBM大型机中得到很广泛的应用.现在逐渐被Base64编码转换方法所取代了. Xxencode编码原理 XXencode将输入文本以每

网站统计中的数据收集原理及实现_其它综合

网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析.百度统计和腾讯分析等等.所有这些统计分析工具的第一步都是网站访问数据的收集.目前主流的数据收集方式基本都是基于javascript的.本文将简要分析这种数据收集的原理,并一步一步实际搭建一个实际的数据收集系统. 数据收集原理分析 简单来说,网站统计分析工具需要收集到用户浏览目标网站的行为(如打开某网页.点击某按钮.将商品加入购物车等)及行为附加数据(如某下单行为产生的订单金额等).早期的网站统计往往只收集一种用户行

在Python中使用base64模块处理字符编码的教程

  这篇文章主要介绍了在Python中使用base64模块处理字符编码的教程,示例代码基于Python2.x版本,需要的朋友可以参考下 Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法.Base64是一种最常见的二进制编码方法. Base64的原理很简单,首先,准备一个包含64个字符

字符编码之Base64

博学,切问,近思--詹子知(http://blog.csdn.net/zhiqiangzhan)  1.什么是Base64. Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RFC2049,上面有MIME的详细规范. 它采用64个可见的基本字符去传输所有信息,因此即使被不同的编码颠来倒去的编码解码也不会造成数据丢失. 索引 对应字符 索引 对应字符 索引 对应字符 索引 对应字符 0 A 17 R 34 i 51 z 1 B 18 S 35 j 5

什么 标签啊什么时候-这是什么编码?Base64解不了

问题描述 这是什么编码?Base64解不了 谁懂得的? Base64解不了! GET /v3/efff?s=1,3,c5b166d4ee93036c,qGnD_7bfw2,1,PzeTzWK6OwTj1oPdw.ssUFyCB-xLVBvsk17RUC2KYKrovZJN4J-RZL8X6R-CcTpLscnvVBPfKlVAd7pDZi7Dq8SNTIQdGXTBkO31UZnXqksuvHhLRB45ZHd8eSARqjXv3bSbkRlK06OHB7uzmrVrFClHNyxY.QEvS3

用PHP对GB编码到UTF-8编码的动态转换

用ip2addr函数直接读取IP数据库文件是效率最高的,相比用MySQL数据库存储IP数据,用SQL查询是效率最低的.但是IP数据库文件QQWry.dat是GB2312编码的.现在我需要UTF-8编码的地理位置结果.如果用MySQL方法,可以在数据存入数据库时就转换为UTF-8编码,一劳永逸.但是QQWry.dat文件又无法修改,只能把ip2addr函数的输出结果再进行动态转换. 动态转换GB->UTF-8编码至少有四种方法: 用PHP的iconv扩展转换 用PHP的mb_string扩展转换

java IO之 编码 (码表 编码 解码 转换流)

编码 什么是编码? 计算机中存储的都是二进制,但是要显示的时候,就是我们看到的却可以有中国 ,a  1 等字符 计算机中是没有存储字符的,但是我们却看到了.计算机在存储这些信息的时候,根据一个有规 则的编号,当用户输入a 有a对映的编号,就将这个编号存进计算机中这就是编码.   计算机只能识别二进制数据. 为了方便应用计算机,让它可以识别各个国家的文字.就将各个国家的文字用数字来表示, 并一一对应,形成一张表,这就是编码表. 例如: 汉字 中  有一种编码: 中字在utf 8中对映的编码   

字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?

转自:  http://apps.hi.baidu.com/share/detail/17798660 字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得字符编码的知识.不注意的人可能对这个不在意,但这些名词有时候实在让人迷惑,对想学习计算机知识的人来说,搞懂它也十分重要,我也是在学习中慢慢了解了一些这方面的知识. 1. ASCII码      在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被