字符串:'Cat‘ 编码后是:oV%T
UUencode PHP实现过程
编码转换过程,与Base64类似!下面代码是实现过程,我们可以看看转换方法!
/**
*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<$snum;$i++)
{
////读取3个字节
$_arr = array_map('ord',str_split(substr($src,$i*$lbyte,$lbyte)));
///计算每一个6位值
$_dec = array();
$_dec[]=$_arr[0]>>2;
$_dec[]=(($_arr[0]&3)<<4)|($_arr[1]>>4);
$_dec[]=(($_arr[1]&0xF)<<2)|($_arr[2]>>6);
$_dec[]=$_arr[2]&63;
///对每个6位值加上32,读取ascii码 如果6位值是0,以字符"`"代替
foreach ($_dec as &$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<$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);
}
内容版权声明:除非注明,否则皆为本站原创文章。
