問題のコードは、ユーザーが簡単な数学の問題に答える必要があるPHPスパム対策CAPTCHAスクリプトであるMathGuardからのものです。数字と演算子記号をランダムな文字の3x5行列として表示します。私は、コードをたどり、コードが何をしているのかを理解できるという意味で、コードがどのように機能するかを理解しています。どうやってこの解決策にたどり着くのか、私にはわかりません。
この関数は、3x5行列の1行を表す整数を取り、それをランダムな文字の行に変換します。
function decToBin($dec) {
$pattern = "123456789ABCDEFGHIJKLMNOPQRTSTUWXYZ";
$output = " ";
$i = 0;
do {
if ($dec % 2) {
$rand = rand() % 34;
$output { 2 - $i } = $pattern { $rand };
} else {
$output { 2 - $i } = " ";
}
$dec = (int) ($dec / 2);
$i++;
} while ($dec > 0);
$output = str_replace(" ", " ", $output);
return $output;
}
数字記述子は次のとおりです。
$number = array (
array ( 7, 5, 5, 5, 7 ), // 0
array ( 2, 6, 2, 2, 7 ), // 1
array ( 7, 1, 7, 4, 7 ), // 2
array ( 7, 1, 7, 1, 7 ), // 3
array ( 4, 5, 7, 1, 1 ), // 4
array ( 7, 4, 7, 1, 7 ), // 5
array ( 7, 4, 7, 5, 7 ), // 6
array ( 7, 1, 1, 1, 1 ), // 7
array ( 7, 5, 7, 5, 7 ), // 8
array ( 7, 5, 7, 1, 7 ) // 9
);
私の質問は、どのようにしてこの結論と生成方法に到達し、たとえば、7
ランダムな文字の完全な行を生成し5
、最も外側の文字のみを生成することを知っているのですか?
これは単なるコード難読化の形式ですか?この方法が、たとえば、数字を文字列111101101101111
として(0
たとえば)格納し、それぞれ1
をランダムな文字に置き換えるよりも優れている理由は何ですか?