【发布时间】:2011-11-11 08:10:39
【问题描述】:
我想将普通文本转换为 \x 代码,例如 \x14\x65\x60
例如:
normal text = "base64_decode"
converted \x codes for above text = "\x62\141\x73\145\x36\64\x5f\144\x65\143\x6f\144\x65"
如何做到这一点?提前致谢。
【问题讨论】:
我想将普通文本转换为 \x 代码,例如 \x14\x65\x60
例如:
normal text = "base64_decode"
converted \x codes for above text = "\x62\141\x73\145\x36\64\x5f\144\x65\143\x6f\144\x65"
如何做到这一点?提前致谢。
【问题讨论】:
ord() 函数为您提供单个字节的十进制值。 dechex() 将其转换为十六进制。所以要做到这一点,循环遍历字符串中的每个字符并应用这两个函数。
【讨论】:
这是工作代码:
function make_hexcodes($text) {
$retval = '';
for($i = 0; $i < strlen($text); ++$i) {
$retval .= '\x'.dechex(ord($text[$i]));
}
return $retval;
}
echo make_hexcodes('base64_decode');
【讨论】:
\xa 而不是 \x0a。想一想,我不知道这是否重要,我一直只是假设它重要。并转义你的反斜杠,因为它需要转义。在单引号字符串中它确实很重要,但它仍然是一个好习惯。
'\x' 中的斜线不需要转义。
To specify a literal backslash, double it (\\)。 PHP 非常擅长理解您的意思,但是由于您仍然可以使用 \ 来指定文字单引号,因此从技术上讲,您应该转义反斜杠。
$str = 'base64_decode';
$length = strlen($str);
$result = '';
for ($i = 0; $i < $length; $i++) $result .= '\\x'.str_pad(dechex(ord($str[$i])),2,'0',STR_PAD_LEFT);
print($result);
【讨论】:
str_pad 在这里是不需要的:它应该只匹配\x[0-9A-Fa-f]{1,2}
PHP 5.3 单行:
echo preg_replace_callback("/./", function($matched) {
return '\x'.dechex(ord($matched[0]));
}, 'base64_decode');
输出\x62\x61\x73\x65\x36\x34\x5f\x64\x65\x63\x6f\x64\x65
【讨论】:
base64_decode('OVUP/PZrLzoZpaeQga/TpK9xeJAOuTTbUzm9NplDuhSUMkklPtDeDQDgidUEIX+ijxe80EI')
对于dechex(ord()) 的替代方案,您还可以使用bin2hex($char)、sprintf('\x%02X') 或unpack('H*', $char)。此外,您可以将array_map 与str_split 一起使用,而不是使用preg_replace_callback。
echo implode(array_map(function($char) {
return '\x' . bin2hex($char);
}, (array) str_split($word)));
echo implode(array_map(function($char) {
return '\x' . implode(unpack('H*', $char));
}, (array) str_split($word)));
echo implode(array_map(function($char) {
return sprintf('\x%02X', ord($char));
}, (array) str_split($word)));
bin2hex
echo implode(array_map(function($char) {
return '\x' . bin2hex($char);
}, (array) str_split('base64_decode')));
结果
\x62\x61\x73\x65\x36\x34\x5f\x64\x65\x63\x6f\x64\x65
解压
echo implode(array_map(function($char) {
return '\x' . implode(unpack('H*', $char));
}, (array) str_split('base64_decode')));
结果
\x62\x61\x73\x65\x36\x34\x5f\x64\x65\x63\x6f\x64\x65
sprintf
echo implode(array_map(function($char) {
return sprintf('\x%02X', ord($char));
}, (array) str_split('base64_decode')));
结果
\x62\x61\x73\x65\x36\x34\x5f\x64\x65\x63\x6f\x64\x65
【讨论】:
我没有读过这段代码 \ud83d\udc33 ?
function unicode_decode(string $str)
{
str="Learn Docker in 12 Minutes \ud83d\udc33"
return preg_replace_callback('/u([0-9a-f]{4})/i', function ($match) {
return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
}, $str);
}
【讨论】: