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转换的

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索编码
, XXencode
XX编码
哈夫曼编码算法原理、url.encode的具体算法、js加密算法encode64、c encode编码、encode在线编码器,以便于您获取更多的相关知识。

时间: 2024-09-22 18:54:43

XXencode 编码,XX编码介绍、XXencode编码转换原理与算法_其它综合的相关文章

Base64 编码介绍、Base64编码转换原理与算法_其它综合

Base64编码,是我们程序开发中经常使用到的编码方法.它是一种基于用64个可打印字符来表示二进制数据的表示方法.它通常用作存储.传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用作电子邮件标准)中一种可打印字符表示二进制数据的常见编码方法!它其实只是定义用可打印字符传输内容一种方法,并不会产生新的字符集!有时候,我们学习转换的思路后,我们其实也可以结合自己的实际需要,构造一些自己接口定义编码方式.好了,我们一起看看,它的转换思路吧! Base64实现转换原理 它是用64个可

UUencode 编码,UU编码介绍、UUencode编码转换原理与算法_其它综合

UUencode编码起先用在unix网络中,先是Unix系统下将二进制的资料借由uucp邮件系统传输的一个编码程式,也是一种二进制到文字的编码.不属于MIME编码中一员.它也是定义了用可打印字符表示二进制文字一种方法,并不是一种新的编码集合.主要解决,二进制字符在传输.存储中问题.它早期在电子邮件中使用较多,最近这些年来基本上被MIME 中Base64所取代了.E-mail中一般采用UU.MIME.BINHEX三种编码标准! 我想,了解下这种编码将二进制字符转换为可打印字符实现思路!对我们以后做

字符编码-vc++编码问题!把十六进制字符串转换成文字!

问题描述 vc++编码问题!把十六进制字符串转换成文字! 假设我有一个cstring a=""1A 2B"" 如何转换成文字并赋值给另外一个cstring? 解决方案 char temp[100];char src[100];strncpy(src (LPCTSTR)a 100);for (int i = 0; i < (a.GetLength() + 1)/3; i++){ temp[i] = (char)(func(src[i * 3]) * 16 + f

PHP实现自动识别原编码并对字符串进行编码转换的方法_php技巧

本文实例讲述了PHP实现自动识别原编码并对字符串进行编码转换的方法.分享给大家供大家参考,具体如下: /** * 对数据进行编码转换 * @param array/string $data 数组 * @param string $output 转换后的编码 * Created on 2016-7-13 */ function array_iconv($data, $output = 'utf-8') { $encode_arr = array('UTF-8','ASCII','GBK','GB2

URL编码转换,escape() encodeURI() encodeURIComponent()_基础知识

escape() 方法:采用ISO Latin字符集对指定的字符串进行编码.所有的空格符.标点符号.特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字).比如,空格符对应的编码是%20.unescape方法与此相反.不会被此方法编码的字符: @ * / + 英文解释:MSDN JScript Reference: The escape method returns a string value (in Unicode format)

Quoted-printable 编码介绍、Quoted-printable编码解码转换方法_其它综合

Quoted-printable 可译为"可打印字符引用编码"."使用可打印字符的编码",我们收邮件,查看信件原始信息,经常会看到这种类型的编码! 最多时候,我们在邮件头里面能够看到这样的编码!Content-Transfer-Encoding:quoted-printable 它是多用途互联网邮件扩展(MIME) 一种实现方式.其中MIME是一个互联网标准,它扩展了电子邮件标准,致力于使其能够支持非ASCII字符.二进制格式附件等多种格式的邮件消息.目前http协

unicode utf-8 gb18030 gb2312 gbk各种编码对比_其它综合

但是我这个的特点是追究原理,我在乎的事情都想弄明白,于是各个qq群依次发信息,没人理会.唉,郁闷.只好自己google it and teach myself .下面是详细介绍. 还有对各方求助没有人理会,我有些个人想法.现在的人已经很少有人去深究理论了,人们的观念是得过且过,人们通常只是知道什么,不知道为什么.对编程来说,个人认为这是很悲哀的事情,也是非常危险的事情.我想可能这也是中国的IT落后于美国的原因,我希望中国的编程人员能够好好想想了. 下面的东西是从网上查到的  Unicode 的编

字符集和字符编码(Charset &amp;amp; Encoding)_其它综合

相信大家一定碰到过,打开某个网页,却显示一堆像乱码,如"бЇЯАзЪСЯ"."�????????"?还记得HTTP中的Accept-Charset.Accept-Encoding.Accept-Language.Content-Encoding.Content-Language等消息头字段?这些就是接下来我们要探讨的. 目录: 1.基础知识 2.常用字符集和字符编码2.1. ASCII字符集&编码2.2. GBXXXX字符集&编码2.3. BIG5字

escape() 字符串编码函数及其它js 编码函数

escape() 字符串编码函数及其它js 编码函数 escape(string) 定义和用法 escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 语法 escape(string)参数 描述 string 必需.要被转义或编码的字符串. 1:说明:所有空格.标点.重音符号以及其他非 ascii 字符都用 %xx 编码代替,其中 xx 等于表示该字符的十六进制数.例如,空格返回的是 "%20" .字符值大于 255 的以 "%uxxxx&quo