在PHP中将十六进制代码转换为可读字符串
大家好,我的社区 我的问题是,如何将包含十六进制代码的php转换为可读字符串? 我的意思是,所有内容都包含在这2个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
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之前对其进行计算。换句话说,它已经被解码了,因为它用双引号括起来。尝试使用单引号括起来的十六进制,它会这是行不通的。