PHP ascii码解码

just_tong 2011-05-03 09:52:50
上周遇到一个问题 就是一串字符串转换成ASCII加密,然后URL传递过来在解码。

这边如何解码我在网上找到一个PHP ascii码转换类,感觉没用。

求高手指导如何,转换和解码。

<?php
class ascii
{

function decode($str)
{
preg_match_all( "/(d{2,5})/", $str,$a);
$a = $a[0];
foreach ($a as $dec)
{
if ($dec < 128)
{
$utf .= chr($dec);
}
else if ($dec < 2048)
{
$utf .= chr(192 + (($dec - ($dec % 64)) / 64));
$utf .= chr(128 + ($dec % 64));
}
else
{
$utf .= chr(224 + (($dec - ($dec % 4096)) / 4096));
$utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
$utf .= chr(128 + ($dec % 64));
}
}
return $utf;
}

function encode($c)
{
$len = strlen($c);
$a = 0;
while ($a < $len)
{
$ud = 0;
if (ord($c{$a}) >=0 && ord($c{$a})<=127)
{
$ud = ord($c{$a});
$a += 1;
}
else if (ord($c{$a}) >=192 && ord($c{$a})<=223)
{
$ud = (ord($c{$a})-192)*64 + (ord($c{$a+1})-128);
$a += 2;
}
else if (ord($c{$a}) >=224 && ord($c{$a})<=239)
{
$ud = (ord($c{$a})-224)*4096 + (ord($c{$a+1})-128)*64 + (ord($c{$a+2})-128);
$a += 3;
}
else if (ord($c{$a}) >=240 && ord($c{$a})<=247)
{
$ud = (ord($c{$a})-240)*262144 + (ord($c{$a+1})-128)*4096 + (ord($c{$a+2})-128)*64 + (ord($c{$a+3})-128);
$a += 4;
}
else if (ord($c{$a}) >=248 && ord($c{$a})<=251)
{
$ud = (ord($c{$a})-248)*16777216 + (ord($c{$a+1})-128)*262144 + (ord($c{$a+2})-128)*4096 + (ord($c{$a+3})-128)*64 + (ord($c{$a+4})-128);
$a += 5;
}
else if (ord($c{$a}) >=252 && ord($c{$a})<=253)
{
$ud = (ord($c{$a})-252)*1073741824 + (ord($c{$a+1})-128)*16777216 + (ord($c{$a+2})-128)*262144 + (ord($c{$a+3})-128)*4096 + (ord($c{$a+4})-128)*64 + (ord($c{$a+5})-128);
$a += 6;
}
else if (ord($c{$a}) >=254 && ord($c{$a})<=255)
{ //error
$ud = false;
}
$scill .= "&#$ud;";
}
return $scill;
}

}
?>
...全文
981 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ImN1 2011-05-03
  • 打赏
  • 举报
回复
var_dump(unpack("c*char", '001D7D70E9AE'));
echo pack('c*',48,48,49,68,55,68,55,48,69,57,65,69);

这两行是互换的,自己看需要选择
ImN1 2011-05-03
  • 打赏
  • 举报
回复
唉,我把问题复杂化了

0的ascii十进制值就是48……

一个个字符对应的
用ord()就行
just_tong 2011-05-03
  • 打赏
  • 举报
回复
恩, 谢谢 是错了!~
xuzuning 2011-05-03
  • 打赏
  • 举报
回复
你的代码错了!是从网上复制过来的吧?

function decode($str)
{
preg_match_all( "/(\d{2,5})/", $str,$a);
$a = $a[1];
....
just_tong 2011-05-03
  • 打赏
  • 举报
回复
是唉 这个是我用来测试的! 我要的东西是:ASCII码解码后的东西。

就是怎么把484849685568554869576569 转换成001D7D70E9AE?
ImN1 2011-05-03
  • 打赏
  • 举报
回复
这不是你上面写的结果嘛?!

去掉&#;就行了
just_tong 2011-05-03
  • 打赏
  • 举报
回复
001D7D70E9AE这个字符转换成ASCII 为这个:484849685568554869576569
just_tong 2011-05-03
  • 打赏
  • 举报
回复
不是的! 我是吧这个字符串"001D7D70E9AE" 变为ASCII码 用来测试,想要的结果是这个001D7D70E9AE
ImN1 2011-05-03
  • 打赏
  • 举报
回复
}p
--------------------------

你想要的正确结果是这个么?
just_tong 2011-05-03
  • 打赏
  • 举报
回复
对方就说了用ASCII加密 其他都没说
ImN1 2011-05-03
  • 打赏
  • 举报
回复
不知道原来的算法,怎么解?既然对方传过来,都会跟你说清楚转换方法的吧?

一般ASCII和字节型互换用chr()、ord()这两个函数
just_tong 2011-05-03
  • 打赏
  • 举报
回复
比如我有个字符串:001D7D70E9AE
用上面的类转成了:001D7D70E9AE
然后解码 就是不行。出现都是空值

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧