XXencode 编码,XX编码介绍、XXencode编码转换原理与算法

 更新时间:2016年06月04日 21:29:06   作者:程默  
这篇文章主要介绍了XXencode 编码,XX编码介绍、XXencode编码转换原理、算法,需要的朋友可以参考下

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

Xxencode编码原理

XXencode将输入文本以每三个字节为单位进行编码。如果最后剩下的资料少于三个字节,不够的部份用零补齐。这三个字节共有24个Bit,以6bit为单位分为4个组,每个组以十进制来表示所出现的数值只会落在0到63之间。以所对应值的位置字符代替。它所选择的可打印字符是:+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,一共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 1 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 1 1 1 0 1 0 0
新的十进制数值 16 54 5 52
编码后的XXencode字符 E q 3 O
字符串:'Cat‘ 编码后是:Eq3O

XXencode编码PHP实现过程

/**
 *xxencode编码*
 *@author 程默
 *@copyright http://blog.chacuo.net/
 *@param string $src 待处理字符串
 *@return string encode编码完字符串
 */
function c_xx_encode($src)
{
	//64个可打印字符
	static $base="+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
 ///每次读取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;
  
 ///求每一位值,在64字符中所对应的字符
 foreach ($_dec as &$v)
 {
  $v=$base[$v];
 }
 $desc = array_merge($desc,$_dec);
 }
 

 //每60个编码输出(相当于45个输入字节)将输出为独立的一行,每行的开头会加上长度字符,除了最后一行之外,长度字符都应该是'h'这个ASCII字符(45),最后一行的长度字符为剩下的字节数目,在64字符中对应字符。
 $abyte = 60;
 $crlf = "\r\n";
 $alen = count($desc);
 $anum = floor($alen/$abyte);
 $amod = ($alen%$abyte);
 
 $adesc = array();
 
 for ($i=0;$i<$anum;$i++)
 {
 $adesc[]='h'.implode('',array_slice($desc,$i*$abyte,$abyte)).$crlf;
 }
 
 ///截取后面剩余数组长度
 if($amod!==0)
 {
 ///以下计算不满45字节编码情况
 $adesc[]=$base[$amod/4*$lbyte+($smod?$smod-$lbyte:$smod)].implode('',array_slice($desc,-$amod)).$crlf;
 }
 
 return implode('',$adesc); 
}

以上代码从uuencode编码做简单修改而来,基本上去掉+32一些地方。知道编码原理,其实我们很容易实现uuencode->xxencode转换的

以上转换后结果,与专业转换工具一致的。好了,通过学习这类用可打印字符表示二进制字节的编码方法。我们可以发现很多有趣东西!对应以后我们如果做自己的编码转换,可以给我们很多借鉴!欢迎朋友们给出自己的意见!

相关文章

  • SSO单点登录和OAuth2.0区别小结

    SSO单点登录和OAuth2.0区别小结

    很多时候我们会使用单点登录SSO或者OAuth2.0等身份验证和授权来实现登录,本文主要介绍了SSO单点登录和OAuth2.0区别小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • 趣谈Unicode、Ascii、utf-8、GB2312、GBK等编码知识

    趣谈Unicode、Ascii、utf-8、GB2312、GBK等编码知识

    这篇文章主要介绍了趣谈Unicode、Ascii、utf-8、GB2312、GBK等编码知识,文章写的诙谐风趣,膜拜啊,需要的朋友可以参考下
    2014-07-07
  • Vscode中launch.json与tasks.json文件的详细介绍

    Vscode中launch.json与tasks.json文件的详细介绍

    在VSCode中,launch.json和tasks.json作为两个重要的配置文件,能够帮助开发者实现调试和任务运行的自动化配置,下面这篇文章主要给大家介绍了关于Vscode中launch.json与tasks.json文件的相关资料,需要的朋友可以参考下
    2024-07-07
  • GCC 指令详解及动态库、静态库的使用方法

    GCC 指令详解及动态库、静态库的使用方法

    GCC 是 Linux 下的编译工具集,是「GNU Compiler Collection」的缩写,包含 gcc、g++ 等编译器,这篇文章主要介绍了GCC 指令详解及动态库、静态库的使用,需要的朋友可以参考下
    2022-10-10
  • Webpack基础教程之名词解释

    Webpack基础教程之名词解释

    webpack 是一个现代JavaScript 应用程序的静态模块打包器,这次为大家简单介绍一下webpack及关于webpack的一些专属名词入口(entry),输出(output),loader,插件(plugins)
    2020-02-02
  • Git常用命令汇总

    Git常用命令汇总

    Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。这篇文章介绍了Git的常用命令,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 一文学会Hadoop与Spark等大数据框架知识

    一文学会Hadoop与Spark等大数据框架知识

    Hadoop是一个开源的可运行于大规模集群上的分布式文件系统和运行处理基础框架,Spark是UC Berkeley AMPLab开发的是一种计算框架,分布式资源工作交由集群管理软件(Mesos、YARN),本文介绍Hadoop与Spark大数据框架知识,感兴趣的朋友一起看看吧
    2022-04-04
  • 软件测试面试如何测试一个杯子

    软件测试面试如何测试一个杯子

    本文主要介绍软件测试面试如何测试一个杯子,这里帮大家整理了详细的面试资料,和面试需要准备的知识点,有兴趣的小伙伴可以参考下
    2016-08-08
  • 一文详解软件测试需求分析是什么

    一文详解软件测试需求分析是什么

    需求分析是掌握被测系统的过程,一般测试和开发人员都要进行需求分析,测试方做的需求分析称为测试需求分析,这篇文章主要给大家介绍了关于软件测试需求分析的相关资料,需要的朋友可以参考下
    2007-04-04
  • 基于 Dubbo Admin 动态调整服务超时时间的操作步骤

    基于 Dubbo Admin 动态调整服务超时时间的操作步骤

    Dubbo提供动态调整超时时间的服务治理能力,可以在无需重启应用的情况下,动态调整服务超时时间,这篇文章主要介绍了基于 Dubbo Admin 动态调整服务超时时间,需要的朋友可以参考下
    2022-12-12

最新评论