Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中将十六进制代码转换为可读字符串_Php_String_Hex - Fatal编程技术网

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

在PHP中将十六进制代码转换为可读字符串,php,string,hex,Php,String,Hex,大家好,我的社区 我的问题是,如何将包含十六进制代码的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转换为可读字符串? 我的意思是,所有内容都包含在这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函数来自动将它们转换成可读的代码


谢谢..

似乎您的代码不仅被十六进制转义序列混淆了,而且还被八进制混淆了。我编写此函数是为了为您解码:

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
    );
}

请参见此处的操作:

您可以使用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

我有混合的内容物,除了十六进制和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"
如果没有其他转义序列,或者您不介意不仅转换十六进制转义序列,还转换一些特殊字符(例如
\0
\a
\b
\f
\n
\r
\t
\v
),也可以使用

但如果您只想转换十六进制序列,可以使用来限制应该更改的序列,如下所示:

function hex2str($string) {
    return preg_replace_callback(
        '/(\\\\x[a-f\d]{2})+/i', 
        function ($matches) {
            return stripcslashes($matches[0]);
        },
        $string
    );
}

“\x74\171\x70\145”!=”键入“
你需要双引号(
)来使用这些转义序列。是的,我知道,但我的问题是,要将其转换为可读代码…“\x74\171\x70\145”!=“type”变成“type”!=“type”,这样其他人才能理解我的代码到底是什么。如果我的问题有点复杂,很抱歉..请使用@\\\(x)([0-9a-fA F]{2,3})@对于大写兼容软件:这是一个旧的但不正确的答案。这不是@seekers01认为它在做的事情。在将此语句中的十六进制作为参数传递给urldecode之前对其进行计算。换句话说,它已经被解码了,因为它用双引号括起来。尝试使用单引号括起来的十六进制,它会这是行不通的。