Xxencode也是一种将二进制字符转换为普通打印字符方法。它类似于UUencode编码的原理和方法,只是可打印的字符不同。通过UUencode编码,我们知道它的缺点是64个可打印字符中有很多特殊字符。XXencode编码方法规定了64个原始字符。这里是Base64型。有指定的可打印字符范围和数字。Xxencode编码在上个世纪末被广泛应用于IBM大型机。现在逐渐被Base64编码转换方式取代。
Xxencode编码原理。
XXencode以每三个字节为单位对输入文本进行编码。如果最后剩余的数据少于三个字节,不足的部分将用零填充。这三个字节中有24位,以6位为单位分为4组。每组用十进制表示,数值只会落在0到63之间。替换为相应值的位置字符。它选择可打印字符:-0123456789 abcdefghijklmnopqrstuvwxyzabbcdefghijklmnopqrstuvxyz,总共64个字符。与base64打印字符相比,uuencode多了一个“-”字符,少了一个“/”字符。但是,它的字符序列与Base64完全不同。与UUencode相比,这里选择字符都是普通字符,没有特殊字符。这也决定了它在那个年代流行原因!
每60个编码输出(相当于45个输入字节)将作为一个独立的行输出,长度字符将添加在每行的开头。除了最后一行,长度字符应该是“H”(45,这是64个字符中的第45个‘H’字符),最后一行的长度字符是由剩余字节在64个字符中的位置表示的字符。
问题:如何将uuencode转换成xxencode?
从2的编码原理来看,几乎是一样的。使用的64个字符是不同的。一次,只需从uuencode转换的字符中一点一点地减去32(处理“`”字符),然后得到一个值。该值可以由xxencode 64字符中相应位置的字符替换。
XXencode编码转换过程。
原始字符C a t原始ASCII码(十进制)67 97 116 ASCII码(二进制)0 100 01 10 10 00 01 10 00 01 11 01 00新的十进制值16 54 5 52 XXencode字符E q 3 O编码后的字符串:“Cat”编码后:Eq3O。
XXencode编码PHP的实现过程。
/* * * xxencode code * * @作者成蓦* @版权所有http://blog.chacuo.net/* @ param string $要处理的src字符串* @返回字符串encode finished string */function c _ xx _ encode($ src){//64个可打印字符static $ base='-0123456789 abcdefghijklmnopqrstuvwxyzabbcdefghijklmnopqrstuvwxyz ';///一次读取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(' order ',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;///求每个位的值,64个字符中对应的字符为foreach($ _ dec as $ v){ $ v=$ base[$ v];} $desc=array_merge($desc,$ _ dec);}//每60个编码输出(相当于45个输入字节)将作为一个独立的行输出,并且在每行的开头添加长度字符。除了最后一行,长度字符应该是ASCII字符‘h’(45),最后一行的长度字符是剩余字节数,对应64个字符中的字符。$ abyte=60$ crlf=' r n$ alen=count($ desc);$ anm=floor($ alen/$ aby te);$ amod=($ alen % $ abyte);$ adesc=array();for($ I=0;$ i $ anum$i ) { $adesc[]='h '。内爆('',array_slice($desc,$i*$abyte,$abyte))。$ crlf}///截取剩余的数组长度if($amod!==0) {///以下计算小于45字节编码$ adesc[]=$ base[$ amod/4 * $ lbyte($ smod?$smod-$lbyte:$smod)]。内爆('',array_slice($desc,-$amod))。$ crlf} return inquide(',$ adesc);}
上面的代码是从uuencode编码简单修改而来的,32的一些地方基本去掉了。知道了编码原理,其实就很容易实现uuencode-xxencode的转换。
以上转换结果与专业转换工具一致。好了,通过学习这种用可打印字符表示二进制字节的编码方法。我们可以发现许多有趣的事情!对应未来,如果我们自己做编码转换,可以从中学到很多!欢迎朋友们给出自己的意见!