6

StackOverflow コミュニティの皆様、こんにちは。

これが私の質問です。16進コードを持つ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");

?>

その16進数をエコーし​​て読み取り可能な文字列に変更できることはわかっていますが、巨大なphpファイルとこれと同じようにたくさんのphpファイルがあるため、それらすべてを読み取り可能なコードに自動的に変換できるphp関数が必要です。

感謝..

4

4 に答える 4

14

あなたのコードは、16 進数のエスケープ シーケンスだけでなく、8 進数でも難読化されているようです。私はあなたのためにそれをデコードするためにこの関数を書きました:

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

于 2012-12-08T04:05:36.310 に答える
8

16 進数と 10 進数のほかに通常の文字もある混合コンテンツがありました。

上記のショーンのコードを更新するために、次のように追加しました

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"
于 2013-10-26T11:40:10.233 に答える
2

これを実現するには、PHP のネイティブ urldecode() 関数を使用できます。16 進数でエンコードされた文字列を関数に渡すだけで、出力は読み取り可能な形式の文字列になります。

デモ用のサンプル コードを次に示します。

<?php

echo urldecode("\x74\150\x69\163\x20\151\x73\40\x74\145\x73\164\x69\156\x67\40\x6f\156\x6c\171");

?>

これは次のように出力されます: this is testing only

-- seekers01

于 2013-07-29T02:41:34.093 に答える