<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>程默的博客 &#187; base64</title>
	<atom:link href="http://blog.chacuo.net/tag/base64/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.chacuo.net</link>
	<description>web原理、web架构、web安全、web性能、服务器性能、服务器架构、服务器安全;你不能预知明天，但你可以利用今天。你不能样样顺利，但你可以事事尽力!</description>
	<lastBuildDate>Mon, 31 Aug 2020 15:33:40 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Base64 编码介绍、Base64编码转换原理、算法</title>
		<link>http://blog.chacuo.net/719.html</link>
		<comments>http://blog.chacuo.net/719.html#comments</comments>
		<pubDate>Tue, 30 Jul 2013 12:29:19 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web原理]]></category>
		<category><![CDATA[base64]]></category>
		<category><![CDATA[字符编码]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=719</guid>
		<description><![CDATA[Base64编码，是我们程序开发中经常使用到的编码方法。它是一种基于用64个可打印字符来表示二进制数据的表示方 [...]]]></description>
				<content:encoded><![CDATA[<p>Base64编码，是我们程序开发中经常使用到的编码方法。它是一种基于用64个可打印字符来表示二进制数据的表示方法。它通常用作存储、传输一些二进制数据编码方法！也是MIME（多用途互联网邮件扩展，主要用作电子邮件标准）中一种可打印字符表示二进制数据的常见编码方法！它其实只是定义用可打印字符传输内容一种方法，并不会产生新的字符集！有时候，我们学习转换的思路后，我们其实也可以结合自己的实际需要，构造一些自己接口定义编码方式。好了，我们一起看看，它的转换思路吧！</p>
<p><strong>Base64实现转换原理</strong></p>
<p>它是用64个可打印字符表示二进制所有数据方法。由于2的6次方等于64，所以可以用每6个位元为一个单元，对应某个可打印字符。我们知道三个字节有24个位元，就可以刚好对应于4个Base64单元，即3个字节需要用4个Base64的可打印字符来表示。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ，这样共有62个字符，此外两个可打印符号在不同的系统中一般有所不同。但是，我们经常所说的Base64另外2个字符是：“+/”。这64个字符，所对应表如下。</p>
<blockquote><table class="table" border="1" rules="all" cellspacing="0" width="80%" align="center">
<tbody>
<tr>
<th scope="col">编号</th>
<th scope="col">字符</th>
<th rowspan="18">&nbsp;</th>
<th scope="col">编号</th>
<th scope="col">字符</th>
<th rowspan="18">&nbsp;</th>
<th scope="col">编号</th>
<th scope="col">字符</th>
<th rowspan="18">&nbsp;</th>
<th scope="col">编号</th>
<th scope="col">字符</th>
</tr>
<tr>
<td>0</td>
<td>A</td>
<td>16</td>
<td>Q</td>
<td>32</td>
<td>g</td>
<td>48</td>
<td>w</td>
</tr>
<tr>
<td>1</td>
<td>B</td>
<td>17</td>
<td>R</td>
<td>33</td>
<td>h</td>
<td>49</td>
<td>x</td>
</tr>
<tr>
<td>2</td>
<td>C</td>
<td>18</td>
<td>S</td>
<td>34</td>
<td>i</td>
<td>50</td>
<td>y</td>
</tr>
<tr>
<td>3</td>
<td>D</td>
<td>19</td>
<td>T</td>
<td>35</td>
<td>j</td>
<td>51</td>
<td>z</td>
</tr>
<tr>
<td>4</td>
<td>E</td>
<td>20</td>
<td>U</td>
<td>36</td>
<td>k</td>
<td>52</td>
<td>0</td>
</tr>
<tr>
<td>5</td>
<td>F</td>
<td>21</td>
<td>V</td>
<td>37</td>
<td>l</td>
<td>53</td>
<td>1</td>
</tr>
<tr>
<td>6</td>
<td>G</td>
<td>22</td>
<td>W</td>
<td>38</td>
<td>m</td>
<td>54</td>
<td>2</td>
</tr>
<tr>
<td>7</td>
<td>H</td>
<td>23</td>
<td>X</td>
<td>39</td>
<td>n</td>
<td>55</td>
<td>3</td>
</tr>
<tr>
<td>8</td>
<td>I</td>
<td>24</td>
<td>Y</td>
<td>40</td>
<td>o</td>
<td>56</td>
<td>4</td>
</tr>
<tr>
<td>9</td>
<td>J</td>
<td>25</td>
<td>Z</td>
<td>41</td>
<td>p</td>
<td>57</td>
<td>5</td>
</tr>
<tr>
<td>10</td>
<td>K</td>
<td>26</td>
<td>a</td>
<td>42</td>
<td>q</td>
<td>58</td>
<td>6</td>
</tr>
<tr>
<td>11</td>
<td>L</td>
<td>27</td>
<td>b</td>
<td>43</td>
<td>r</td>
<td>59</td>
<td>7</td>
</tr>
<tr>
<td>12</td>
<td>M</td>
<td>28</td>
<td>c</td>
<td>44</td>
<td>s</td>
<td>60</td>
<td>8</td>
</tr>
<tr>
<td>13</td>
<td>N</td>
<td>29</td>
<td>d</td>
<td>45</td>
<td>t</td>
<td>61</td>
<td>9</td>
</tr>
<tr>
<td>14</td>
<td>O</td>
<td>30</td>
<td>e</td>
<td>46</td>
<td>u</td>
<td>62</td>
<td>+</td>
</tr>
<tr>
<td>15</td>
<td>P</td>
<td>31</td>
<td>f</td>
<td>47</td>
<td>v</td>
<td>63</td>
<td>/</td>
</tr>
</tbody>
</table>
</blockquote>
<p><strong>Base64编码转换算法、转换原理</strong></p>
<blockquote><p>转换的时候，将三个byte的数据，先后放入一个24bit的缓冲区中，先来的byte占高位。数据不足3byte的话，于缓冲区中剩下的bit用0补足。然后，每次取出6个bit，按照其值选择<code><br />ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/</code>中的字符作为编码后的输出。不断进行，直到全部输入数据转换完成。
<p>如果最后剩下两个输入数据，在编码结果后加1个“=”；如果最后剩下一个输入数据，编码结果后加2个“=”；如果没有剩下任何数据，就什么都不要加，这样才可以保证资料还原的正确性。
<p>编码后的数据比原始数据略长，为原来的4/3。无论什么样的字符都会全部被编码，因此不像<a href="http://blog.chacuo.net/494.html">Quoted-printable</a> 编码，还保留部分可打印字符。所以，它的可读性不如<a href="http://blog.chacuo.net/494.html">Quoted-printable</a> 编码！</p>
<p>
<table class="table" border="1" rules="all" cellspacing="0" width="80%" align="center">
<tbody>
<tr>
<th scope="row">文本</th>
<td colspan="8" align="middle"><b>M</b></td>
<td colspan="8" align="middle"><b>a</b></td>
<td colspan="8" align="middle"><b>n</b></td>
</tr>
<tr>
<th scope="row">ASCII编码</th>
<td colspan="8" align="middle">77</td>
<td colspan="8" align="middle">97</td>
<td colspan="8" align="middle">110</td>
</tr>
<tr>
<th scope="row">二进制位</th>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>0</td>
</tr>
<tr>
<th scope="row">索引</th>
<td colspan="6" align="middle">19</td>
<td colspan="6" align="middle">22</td>
<td colspan="6" align="middle">5</td>
<td colspan="6" align="middle">46</td>
</tr>
<tr>
<th scope="row">Base64编码</th>
<td colspan="6" align="middle"><b>T</b></td>
<td colspan="6" align="middle"><b>W</b></td>
<td colspan="6" align="middle"><b>F</b></td>
<td colspan="6" align="middle"><b>u</b></td>
</tr>
</tbody>
</table>
<p>M的Ascii码是77,前六位对应值为19，对应base64字符是T，如此类推。其它字符编码就可以自动转换得到！我们看看另外不是刚好是3个字节的情况！</p>
<p>&nbsp;</p>
<p>
<table class="table" border="1" rules="all" cellspacing="0" width="80%" align="center">
<tbody>
<tr>
<th scope="row">文本（1 Byte）</th>
<td colspan="8" align="middle"><b>A</b></td>
<td colspan="8" align="middle">&nbsp;</td>
<td colspan="8" align="middle">&nbsp;</td>
</tr>
<tr>
<th scope="row">二进制位</th>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<th scope="row">二进制位（补0）</th>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td><b>0</b></td>
<td><b>0</b></td>
<td><b>0</b></td>
<td><b>0</b></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<th scope="row">Base64编码</th>
<td colspan="6" align="middle"><b>Q</b></td>
<td colspan="6" align="middle"><b>Q</b></td>
<td colspan="6" align="middle"><strong>=</strong></td>
<td colspan="6" align="middle"><strong>=</strong></td>
</tr>
<tr>
<th scope="row">文本（2 Byte）</th>
<td colspan="8" align="middle"><b>B</b></td>
<td colspan="8" align="middle"><b>C</b></td>
<td colspan="8" align="middle">&nbsp;</td>
</tr>
<tr>
<th scope="row">二进制位</th>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
</tr>
<tr>
<th scope="row">二进制位（补0）</th>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td><b>0</b></td>
<td><b>0</b></td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
</tr>
<tr>
<th scope="row">Base64编码</th>
<td colspan="6" align="middle"><b>Q</b></td>
<td colspan="6" align="middle"><b>k</b></td>
<td colspan="6" align="middle"><b>M</b></td>
<td colspan="6" align="middle">&nbsp;<strong>=</strong></td>
</tr>
</tbody>
</table>
</blockquote>
<p><strong>Base64转换代码实现</strong></p>
<p>既然知道了方法，那么我们如果要自己写个简单转换，好像也是很容易的！下面，我写下我做转换php代码！</p>
<blockquote><p>&nbsp;
<pre class="brush: php; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;">/**
 *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&lt;$snum;$i++)
	{
		////读取3个字节
		$_arr = array_map('ord',str_split(substr($src,$i*3,3)));
		
		///计算每一个base64值
		$_dec0= $_arr[0]&gt;&gt;2;
		$_dec1= (($_arr[0]&amp;3)&lt;&lt;4)|($_arr[1]&gt;&gt;4);
		$_dec2= (($_arr[1]&amp;0xF)&lt;&lt;2)|($_arr[2]&gt;&gt;6);	
		$_dec3= $_arr[2]&amp;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]&gt;&gt;2;
	///只有一个字节
	if(!isset($_arr[1]))
	{
		$_dec1= (($_arr[0]&amp;3)&lt;&lt;4);
		$_dec2=$_dec3="=";
	}
	else 
	{
		///2个字节
		$_dec1= (($_arr[0]&amp;3)&lt;&lt;4)|($_arr[1]&gt;&gt;4);
		$_dec2= $base[($_arr[1]&amp;7)&lt;&lt;2];
		$_dec3="=";
	}
	$desc = array_merge($desc,array($base[$_dec0],$base[$_dec1],$_dec2,$_dec3));
	return implode('',$desc);
}</pre>
</blockquote>
<blockquote><pre><a href="http://blog.chacuo.net/wp-content/uploads/2013/07/image9.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="base64编码转换原理" border="0" alt="base64编码转换原理" src="http://blog.chacuo.net/wp-content/uploads/2013/07/image_thumb9.png" width="825" height="459"></a> </pre>
</blockquote>
<p>好了，通过这个例子，我想base64编码转换原理、算法有些了解了吧！它转换过程很简单，只需要做个映射表，然后将原先做一些移位运算就可以完成！我们通过该例子，是不是可以做个自己的base32这类的编码呢！欢迎朋友们交流！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/719.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
