XXencode 编码,XX编码介绍、XXencode编码转换原理与算法
作者:程默 发布时间:2023-11-06 19:14:48
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转换的
以上转换后结果,与专业转换工具一致的。好了,通过学习这类用可打印字符表示二进制字节的编码方法。我们可以发现很多有趣东西!对应以后我们如果做自己的编码转换,可以给我们很多借鉴!欢迎朋友们给出自己的意见!
猜你喜欢
- Python pywifi ERROR Open handle failed这个问题的网上的资料很少,可能是因为简单吧。这里记录下解决办法。
- 当您使用FILESYSTEMOBJECT(fso)对象获得某个目录下的文件列表的时候,你有没有发现无法控制它们的排序方式,比如按照名字排序,
- 作者:HelloGitHub-追梦人物文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库搜索是一个复杂的功能,但对于
- Django中提供了一个关于URL的映射的解决方案,1.客户端的浏览器发起一个url请求,Django根据URL解析,把url中的参数捕获,
- vue数据变化被watch监听处理监听当前vue文件数据例如,当前的vue文件的data中有如下属性:data() {  
- 目录1.准备工作2. 开始2.1 生成控件2.2 定义输入和计算函数2.3 绑定键盘事件2.4 循环3.全部代码4. 结束语做一个计算器,这
- 本教程旨在介绍如何使用七牛的Python SDK来快速地进行文件上传,下载,处理,管理等工作。安装首先,要使用Python的SDK必须要先安
- 自开始做项目以来,一直在用。这段存储过程的的原创者(SORRY,忘记名字了),写得这段SQL代码很不错,我在这个基础上,按照我的习惯以及思维
- 自动化收集SQLSERVER诊断信息相信很多人都遇到过当SQLSERVER出现问题的时候,而你又解决不了需要DBA或者微软售后支持工程师去帮
- import pyspherefrom pysphere import VIServerhost_ip = "200.200.17
- PyQt5布局控件QGridLayout简介QGridLayout(网格布局)是将窗口分割成行和列的网格来进行排列,通常可以使用函数addW
- 1) chocolatappChocolat是最新出现的一款强大的Mac系统文本编辑器,兼具原生的Cocoa及强大的文本编辑功能。Choco
- 一、首先要确保你的电脑上opencv的环境和visual studio上的环境都配置好了,测试的时候通过了没有问题。二、那么只要在你项目里面
- 很多的网站都有记数器,用来记录网站的访问量,这给网站管理员即时了解本网站的运行及访问情况提供了很多的方便。笔者研究过很多用ASP编写的计数器
- 前言在诸多的管理类,办公类等系统中,树形结构展示随处可见,以“部门”或"机构"来说,接触过的同学应该都知道,最终展示到页
- 常用功能 mean(data)mean(data)用于求给定序列或者迭代器的算术平均数。import statisticsexample_l
- 重置oracle序列从指定数字开始 代码如下:declare n number(10); v_startnum number(10):=1
- AERGO SHIP:用于开发智能合约的包管理器用于构建、测试和部署分布式应用程序的客户端框架和开发环境构建大型分布式应用程序是很困难的,因
- 上次我写过一篇文章,讨论"JavaScript类定义原型方法的两种实现的区别"。研究后发现除了方法的初始化方式不同外,没
- 用两个文件.GLOBAL.ASA和online.asp下面分别给出两个文件的源代码.呵呵,我也是菜鸟,大家加油哟!<SCR