<?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; uuencode</title>
	<atom:link href="http://blog.chacuo.net/tag/uuencode/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>UUencode 编码，UU编码介绍、UUencode编码转换原理、算法</title>
		<link>http://blog.chacuo.net/753.html</link>
		<comments>http://blog.chacuo.net/753.html#comments</comments>
		<pubDate>Thu, 01 Aug 2013 10:16:47 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web原理]]></category>
		<category><![CDATA[uuencode]]></category>
		<category><![CDATA[字符编码]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=753</guid>
		<description><![CDATA[UUencode编码起先用在unix网络中，先是Unix系统下将二进制的资料借由uucp邮件系统传输的一个编码 [...]]]></description>
				<content:encoded><![CDATA[<p>UUencode编码起先用在unix网络中，先是Unix系统下将二进制的资料借由uucp邮件系统传输的一个编码程式，也是一种二进制到文字的编码。不属于MIME编码中一员。它也是定义了用可打印字符表示二进制文字一种方法，并不是一种新的编码集合。主要解决，二进制字符在传输、存储中问题。它早期在电子邮件中使用较多，最近这些年来基本上被MIME 中Base64所取代了。E-mail中一般采用UU、MIME、BINHEX三种编码标准! 我想，了解下这种编码将二进制字符转换为可打印字符实现思路！对我们以后做类似处理工作，应该会有很多的启示。</p>
<p><strong>UUencode编码过程</strong></p>
<p>Uuencode将输入资料以每三个字节为单位进行编码，如此重复进行。如果最后剩下的资料少于三个字节，不够的部份用零补齐。这三个字节共有24个Bit，以6-bit为单位分为4个群组，每个群组以十进制来表示所出现的数值只会落在0到63之间。将每个数加上32，所产生的结果刚好落在ASCII字符集中可打印字符（32-空白&#8230;95-底线）的范围之中。每60个编码输出（相当于45个输入字节）将输出为独立的一行，每行的开头会加上<b>长度字符</b>，除了最后一行之外，长度字符都应该是&#8217;M'这个ASCII字符（77=32+<b>45</b>），最后一行的长度字符为<b>32+剩下的字节数目</b>这个ASCII字符。如果是一个 0字节那它应该被转换为0&#215;60而不是0&#215;20，因为（前引用&#8217;`'）优于 0&#215;20（空格&#8217; &#8216;)。</p>
<p>特点一：看到特点了吧，也是64字符，也是一组6位。怎么,怎么,跟我们的<a title="base64算法、编码原理" href="http://blog.chacuo.net/719.html" target="_blank">base64</a>这么相似呢？是的，从这个定义中，我们确实发现它跟base64比起来很相似了。 </p>
<p>特点二：它定义64字符，不用写映射表，是通过加32转换到可打印字符范围中。比起base64，更为简单！</p>
<p><strong>思考问题：</strong>它的字符范围都是可打印字符，我们会发现64字符集合中，有很多是特殊字符:”!&#8221;#￥%&amp;‘（）*+=’” 等等。这些字符在不同应用中，可能都有些特殊用途。因此，在使用该编码时候，或许会出现一些问题。我想这也许是UUencode编码方法，逐渐被Base64所取代的原因吧。</p>
<blockquote><pre><font style="background-color: #ffffff" face="Arial"><strong>UUencode 64字符集</strong></font></pre>
<pre><table class="table" border="1" rules="all" cellspacing="0" width="80%" align="center"><tbody><tr valign="bottom"><th>可打印字符</th><th>十进制ASCII值</th><th>uuencode<br />二进制表示</th><th>uuencode<br />十进制表示</th><th>&nbsp;</th><th>可打印字符</th><th>十进制ASCII值</th><th>uuencode<br />二进制表示</th><th>uuencode<br />十进制表示</th></tr><tr><td align="middle">(space)</td><td align="middle">32</td><td align="middle">000 000</td><td align="middle">0</td><td>&nbsp;</td><td align="middle">@</td><td align="middle">64</td><td align="middle">100 000</td><td align="middle">32</td></tr><tr><td align="middle">!</td><td align="middle">33</td><td align="middle">000 001</td><td align="middle">1</td><td>&nbsp;</td><td align="middle">A</td><td align="middle">65</td><td align="middle">100 001</td><td align="middle">33</td></tr><tr><td align="middle">"</td><td align="middle">34</td><td align="middle">000 010</td><td align="middle">2</td><td>&nbsp;</td><td align="middle">B</td><td align="middle">66</td><td align="middle">100 010</td><td align="middle">34</td></tr><tr><td align="middle">#</td><td align="middle">35</td><td align="middle">000 011</td><td align="middle">3</td><td>&nbsp;</td><td align="middle">C</td><td align="middle">67</td><td align="middle">100 011</td><td align="middle">35</td></tr><tr><td align="middle">$</td><td align="middle">36</td><td align="middle">000 100</td><td align="middle">4</td><td>&nbsp;</td><td align="middle">D</td><td align="middle">68</td><td align="middle">100 100</td><td align="middle">36</td></tr><tr><td align="middle">%</td><td align="middle">37</td><td align="middle">000 101</td><td align="middle">5</td><td>&nbsp;</td><td align="middle">E</td><td align="middle">69</td><td align="middle">100 101</td><td align="middle">37</td></tr><tr><td align="middle">&amp;</td><td align="middle">38</td><td align="middle">000 110</td><td align="middle">6</td><td>&nbsp;</td><td align="middle">F</td><td align="middle">70</td><td align="middle">100 110</td><td align="middle">38</td></tr><tr><td align="middle">'</td><td align="middle">39</td><td align="middle">000 111</td><td align="middle">7</td><td>&nbsp;</td><td align="middle">G</td><td align="middle">71</td><td align="middle">100 111</td><td align="middle">39</td></tr><tr><td align="middle">(</td><td align="middle">40</td><td align="middle">001 000</td><td align="middle">8</td><td>&nbsp;</td><td align="middle">H</td><td align="middle">72</td><td align="middle">101 000</td><td align="middle">40</td></tr><tr><td align="middle">)</td><td align="middle">41</td><td align="middle">001 001</td><td align="middle">9</td><td>&nbsp;</td><td align="middle">I</td><td align="middle">73</td><td align="middle">101 001</td><td align="middle">41</td></tr><tr><td align="middle">*</td><td align="middle">42</td><td align="middle">001 010</td><td align="middle">10</td><td>&nbsp;</td><td align="middle">J</td><td align="middle">74</td><td align="middle">101 010</td><td align="middle">42</td></tr><tr><td align="middle">+</td><td align="middle">43</td><td align="middle">001 011</td><td align="middle">11</td><td>&nbsp;</td><td align="middle">K</td><td align="middle">75</td><td align="middle">101 011</td><td align="middle">43</td></tr><tr><td align="middle">,</td><td align="middle">44</td><td align="middle">001 100</td><td align="middle">12</td><td>&nbsp;</td><td align="middle">L</td><td align="middle">76</td><td align="middle">101 100</td><td align="middle">44</td></tr><tr><td align="middle">-</td><td align="middle">45</td><td align="middle">001 101</td><td align="middle">13</td><td>&nbsp;</td><td align="middle">M</td><td align="middle">77</td><td align="middle">101 101</td><td align="middle">45</td></tr><tr><td align="middle">.</td><td align="middle">46</td><td align="middle">001 110</td><td align="middle">14</td><td>&nbsp;</td><td align="middle">N</td><td align="middle">78</td><td align="middle">101 110</td><td align="middle">46</td></tr><tr><td align="middle">/</td><td align="middle">47</td><td align="middle">001 111</td><td align="middle">15</td><td>&nbsp;</td><td align="middle">O</td><td align="middle">79</td><td align="middle">101 111</td><td align="middle">47</td></tr><tr><td align="middle">0</td><td align="middle">48</td><td align="middle">010 000</td><td align="middle">16</td><td>&nbsp;</td><td align="middle">P</td><td align="middle">80</td><td align="middle">110 000</td><td align="middle">48</td></tr><tr><td align="middle">1</td><td align="middle">49</td><td align="middle">010 001</td><td align="middle">17</td><td>&nbsp;</td><td align="middle">Q</td><td align="middle">81</td><td align="middle">110 001</td><td align="middle">49</td></tr><tr><td align="middle">2</td><td align="middle">50</td><td align="middle">010 010</td><td align="middle">18</td><td>&nbsp;</td><td align="middle">R</td><td align="middle">82</td><td align="middle">110 010</td><td align="middle">50</td></tr><tr><td align="middle">3</td><td align="middle">51</td><td align="middle">010 011</td><td align="middle">19</td><td>&nbsp;</td><td align="middle">S</td><td align="middle">83</td><td align="middle">110 011</td><td align="middle">51</td></tr><tr><td align="middle">4</td><td align="middle">52</td><td align="middle">010 100</td><td align="middle">20</td><td>&nbsp;</td><td align="middle">T</td><td align="middle">84</td><td align="middle">110 100</td><td align="middle">52</td></tr><tr><td align="middle">5</td><td align="middle">53</td><td align="middle">010 101</td><td align="middle">21</td><td>&nbsp;</td><td align="middle">U</td><td align="middle">85</td><td align="middle">110 101</td><td align="middle">53</td></tr><tr><td align="middle">6</td><td align="middle">54</td><td align="middle">010 110</td><td align="middle">22</td><td>&nbsp;</td><td align="middle">V</td><td align="middle">86</td><td align="middle">110 110</td><td align="middle">54</td></tr><tr><td align="middle">7</td><td align="middle">55</td><td align="middle">010 111</td><td align="middle">23</td><td>&nbsp;</td><td align="middle">W</td><td align="middle">87</td><td align="middle">110 111</td><td align="middle">55</td></tr><tr><td align="middle">8</td><td align="middle">56</td><td align="middle">011 000</td><td align="middle">24</td><td>&nbsp;</td><td align="middle">X</td><td align="middle">88</td><td align="middle">111 000</td><td align="middle">56</td></tr><tr><td align="middle">9</td><td align="middle">57</td><td align="middle">011 001</td><td align="middle">25</td><td>&nbsp;</td><td align="middle">Y</td><td align="middle">89</td><td align="middle">111 001</td><td align="middle">57</td></tr><tr><td align="middle">:</td><td align="middle">58</td><td align="middle">011 010</td><td align="middle">26</td><td>&nbsp;</td><td align="middle">Z</td><td align="middle">90</td><td align="middle">111 010</td><td align="middle">58</td></tr><tr><td align="middle">;</td><td align="middle">59</td><td align="middle">011 011</td><td align="middle">27</td><td>&nbsp;</td><td align="middle">[</td><td align="middle">91</td><td align="middle">111 011</td><td align="middle">59</td></tr><tr><td align="middle">&lt;</td><td align="middle">60</td><td align="middle">011 100</td><td align="middle">28</td><td>&nbsp;</td><td align="middle">\</td><td align="middle">92</td><td align="middle">111 100</td><td align="middle">60</td></tr><tr><td align="middle">=</td><td align="middle">61</td><td align="middle">011 101</td><td align="middle">29</td><td>&nbsp;</td><td align="middle">]</td><td align="middle">93</td><td align="middle">111 101</td><td align="middle">61</td></tr><tr><td align="middle">&gt;</td><td align="middle">62</td><td align="middle">011 110</td><td align="middle">30</td><td>&nbsp;</td><td align="middle">^</td><td align="middle">94</td><td align="middle">111 110</td><td align="middle">62</td></tr><tr><td align="middle">?</td><td align="middle">63</td><td align="middle">011 111</td><td align="middle">31</td><td>&nbsp;</td><td align="middle">_</td><td align="middle">95</td><td align="middle">111 111</td><td align="middle">63</td></tr><tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td align="middle">`</td><td align="middle">96</td><td align="middle">(1) 000 000</td><td align="middle">64</td></tr></tbody></table>
</pre>
</blockquote>
<p><strong>UUencode编码转换过程</strong></p>
<blockquote><pre><table class="table" border="1" rules="all" cellspacing="0" width="80%" align="center"><tbody><tr><td>原始字符</td><td colspan="8">C</td><td colspan="8">a</td><td colspan="8">t</td></tr><tr><td>原始ASCII码（十进制）</td><td colspan="8">67</td><td colspan="8">97</td><td colspan="8">116</td></tr><tr><td>ASCII码（二进制）</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>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>1</td><td>0</td><td>1</td><td>0</td><td>0</td></tr><tr><td>新的十进制数值</td><td colspan="6">16</td><td colspan="6">54</td><td colspan="6">5</td><td colspan="6">52</td></tr><tr><td>+32</td><td colspan="6">48</td><td colspan="6">86</td><td colspan="6">37</td><td colspan="6">84</td></tr><tr><td>编码后的Uuencode字符</td><td colspan="6">0</td><td colspan="6">V</td><td colspan="6">%</td><td colspan="6">T</td></tr></tbody></table></pre>
<pre>字符串：'Cat‘ 编码后是：oV%T</pre>
</blockquote>
<p><strong>UUencode PHP实现过程</strong></p>
<p>编码转换过程，与Base64类似！下面代码是实现过程，我们可以看看转换方法！</p>
<blockquote><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;">/**
 *uuencode编码*
 *@author 程默
 *@copyright http://blog.chacuo.net/
 *@param string $src 待处理字符串
 *@return string encode编码完字符串
 */
function c_uu_encode($src)
{
	///每次读取3个字节
	$lbyte = 3;
	////将原始的3个字节转换为4个字节
	$slen=strlen($src);
	$smod = ($slen%$lbyte);
	$snum = floor($slen/$lbyte);


	$desc = array();
	
	//将剩下字节以0字节补齐
	$src = $smod===0?$src:$src.str_repeat("\0",$lbyte-$smod);
	$snum = $smod===0?$snum:$snum+1;

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

		///计算每一个6位值
		$_dec = array();
		$_dec[]=$_arr[0]&gt;&gt;2;
		$_dec[]=(($_arr[0]&amp;3)&lt;&lt;4)|($_arr[1]&gt;&gt;4);
		$_dec[]=(($_arr[1]&amp;0xF)&lt;&lt;2)|($_arr[2]&gt;&gt;6);
		$_dec[]=$_arr[2]&amp;63;
		
		///对每个6位值加上32，读取ascii码 如果6位值是0，以字符"`"代替
		foreach ($_dec as &amp;$v)
		{
			$v = $v===0?'`':chr($v+32);
		}
		$desc = array_merge($desc,$_dec);
	}
	//return implode('',$desc);
	
	///以上代码只是进行转换，没有进一步进行
	//每60个编码输出（相当于45个输入字节）将输出为独立的一行，每行的开头会加上长度字符，除了最后一行之外，长度字符都应该是'M'这个ASCII字符（77=32+45），最后一行的长度字符为32+剩下的字节数目这个ASCII字符。
	$abyte = 60;
	$crlf = "\r\n";
	$alen = count($desc);
	$anum = floor($alen/$abyte);
	$amod = ($alen%$abyte);
	
	$adesc = array();
	
	for ($i=0;$i&lt;$anum;$i++)
	{
		$adesc[]='M'.implode('',array_slice($desc,$i*$abyte,$abyte)).$crlf;
	}
	
	///截取后面剩余数组长度
	if($amod!==0)
	{
		///以下计算不满45字节编码情况
		$adesc[]=chr($amod/4*3+32+($smod?$smod-$lbyte:$smod)).implode('',array_slice($desc,-$amod)).$crlf;
	}
	
	return implode('',$adesc);	
}</pre>
<p>&nbsp;</p>
</blockquote>
<p>以上只是按照转换过程，通过PHP代码实现方法！目前PHP没有UUencode转换模块！</p>
<blockquote>
<p><a href="http://blog.chacuo.net/wp-content/uploads/2013/08/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="UUencode编码" border="0" alt="UUencode编码" src="http://blog.chacuo.net/wp-content/uploads/2013/08/image_thumb.png" width="712" height="208"></a> </p>
<p><a href="http://blog.chacuo.net/wp-content/uploads/2013/08/image1.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="UUencode编码" border="0" alt="UUencode编码" src="http://blog.chacuo.net/wp-content/uploads/2013/08/image_thumb1.png" width="714" height="409"></a> </p>
<p>该代码转换结果，跟使用工具转换结果一致。我查看了线上一些转换方法，很多结果不一致！最好，大家使用在线工具转换前，做一下比较！没有做过验证的代码，可能会给你带来麻烦！欢迎分享你的方法！</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/753.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
