您好StackOverflow社区,
这是我的问题,如何将具有十六进制代码的php转换为可读字符串? 我的意思是所有这2个PHP代码..
<?php
echo "\x74\150\x69\163\x20\151\x73\40\x74\145\x73\164\x69\156\x67\40\x6f\156\x6c\171";
echo test['\x74\171\x70\145'];
echo range("\x61","\x7a");
?>
这是不可读的代码,我需要一些可以将那些不可读代码转换成可读代码的php函数。所以转换后它会变成这样......
<?php
echo "this is testing only";
echo test['type'];
echo range("a","z");
?>
我知道我可以回复那个十六进制来改变它为可读字符串,但我有大量的php文件和很多的php文件,就像这样,所以我需要php函数,它可以自动将它们全部转换为可读代码。< / p>
感谢..
答案 0 :(得分:11)
似乎您的代码不仅使用十六进制转义序列进行混淆,而且还使用八进制进行混淆。我已经编写了这个函数来为你解码它:
function decode_code($code){
return preg_replace_callback(
"@\\\(x)?([0-9a-f]{2,3})@",
function($m){
return chr($m[1]?hexdec($m[2]):octdec($m[2]));
},
$code
);
}
在此处查看此行动:http://codepad.viper-7.com/NjiL84
答案 1 :(得分:6)
我有混合内容,除了hex和oct之外还有正常的字符。
因此,为了更新上面的Sean代码,我添加了以下
function decode_code($code)
{
return preg_replace_callback('@\\\(x)?([0-9a-f]{2,3})@',
function ($m) {
if ($m[1]) {
$hex = substr($m[2], 0, 2);
$unhex = chr(hexdec($hex));
if (strlen($m[2]) > 2) {
$unhex .= substr($m[2], 2);
}
return $unhex;
} else {
return chr(octdec($m[2]));
}
}, $code);
}
示例字符串
"\152\163\x6f\x6e\137d\x65\143\157\x64e"
解码输出
"json_decode"
答案 2 :(得分:2)
您可以使用PHP的本机urldecode()函数来实现此目的。只需将十六进制编码的字符串传递给函数,输出就是可读格式的字符串。
以下是演示代码的示例代码:
<?php
echo urldecode("\x74\150\x69\163\x20\151\x73\40\x74\145\x73\164\x69\156\x67\40\x6f\156\x6c\171");
?>
这应该输出:这只是测试
- seekers01
答案 3 :(得分:0)
如果没有其他转义序列,或者如果您不介意不仅转换十六进制转义序列,还转换某些特殊字符(例如\0
,{{1 }},\a
,\b
,\f
,\n
,\r
和\t
)。
但是,如果您只想转换十六进制序列,则可以使用stripcslashes
来限制应更改的序列,如下所示:
\v