在PHP中将十六进制代码转换为可读字符串

7

大家好,这里是我的问题:如何将具有十六进制代码的php转换为可读字符串? 我的意思是这两个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");

?>

我知道我可以使用echo将十六进制转换为可读字符串,但是我有一个庞大的php文件和很多与此相同的php文件,因此我需要一个php函数,可以自动将它们全部转换为可读代码。

谢谢。


'\x74\171\x70\145' != 'type' 你需要使用双引号(")来使用这些转义序列。 - Musa
是的,我知道,但我的问题是如何将它转换为可读的代码.."\x74\171\x70\145" != "type" 变成 "type" != "type"这样其他人就可以理解我的代码了.. 如果我的问题有点复杂,请见谅。 - Mohd Shahril
4个回答

15

看起来你的代码不仅使用了十六进制转义序列进行混淆,还使用了八进制。我编写了这个函数来为你解码:

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


3
为了实现大写兼容性,请使用 @\(x)?([0-9a-fA-F]{2,3})@。 - Intuitisoft

9

我有一些混合内容,除了十六进制和八进制,还有普通字符。

所以为了更新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
如果没有其他转义序列,或者您不介意转换不仅是十六进制转义序列,还包括一些特殊字符(如\0\a\b\f\n\r\t\v),您也可以使用stripcslashes。 但是,如果您只想转换十六进制序列,可以像这样使用preg_replace_callback来限制应更改哪些序列:
function hex2str($string) {
    return preg_replace_callback(
        '/(\\\\x[a-f\d]{2})+/i', 
        function ($matches) {
            return stripcslashes($matches[0]);
        },
        $string
    );
}

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


2
注意:这是一个旧的但不正确的答案。这不是@seekers01认为它正在做的事情。在将十六进制传递给urldecode作为参数之前,该语句中的十六进制将被评估。换句话说,它已经被解码,因为它被包含在双引号中。尝试使用用单引号包装的十六进制进行此操作,它将无法正常工作。 - bryonbean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接