16 進数は次のように配置されます:
$dict = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
<?php $dict = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; //$num=3844;//intval($_GET['hex'],16); for($test=0;$test<3844;$test++){ $num=$test; $index=0; do{ $cur=$num%62; $output[$index]=$dict[$cur]; //echo $output[$index].' '; $num=floor($num/62); $index++; //echo $cur.' '; }while($num); $output[$index]='!'; $index--; $aide=0; while($index>$aide){ $tmp=$output[$index]; $output[$index]=$output[$aide]; $output[$aide]=$tmp; $aide++; $index--; } $index=0; while($output[$index]<>'!'){ echo $output[$index]; $index++; } if(($test+1)%62==0) echo '<br />'; }?>
私はPHPにあまり詳しくなく、C言語の観点から考えているところが多いので、非常にぎこちないところもあります。さらに、私が書いたものにエラーがないことを保証することはできません。PHP には非常に曖昧な部分が多くあります。 forは3桁以下の62桁の数字は問題ないようです。
さらに、配列を文字列に変換する方法がわかりません。自分で行うことができます。私はもうやりたくないです。
値の範囲が整数の範囲を超える場合にも問題が発生します。より大きな数値を変換したい場合は、これを参照してください:
http://www.php.net/manual/en/book.bc.php
値の範囲が整数値の範囲を超える場合にも問題が発生します。 。より大きな数値を変換したい場合は、これを見てください:
高精度の数学関数は使用しないでください、サーバーが無効にしているため、すでに人々が言っています
http://www.php.net/manual/en/book.bc.php どのような混乱を起こしているのでしょうか?
高精度の数学関数を使用しないでください、サーバーがそれらを無効にしているため、人々はすでに言っています
忘れていました、私はこれらの数行のコードを長い間書いていましたが、その後、大規模な関数を試したときに何か問題が発生したことがわかりました番号。
先生、変換したい16進数は整数データの最大値を超えませんか?
これには BCMath は必要ないかもしれませんが、私は試していません:
http://phpseclib.bantux.org/code_coverage/220/PHP-5.2/Math_BigInteger.php.html
先生、あなたが知りたい 16 進数変換はプラスチックデータの最大値を超えていますか?
いいえ、その 16 進数は実際には md5 暗号化の結果です
いいえ、その 16 進数は実際には md5 暗号化の結果です
MD5 のこれほど多くの桁が整数の表現範囲を超えないということがどうしてあり得ますか?
上記のリンクのコードはダウンロードできないようです。これはダウンロードできます:
http://pear.php.net/package/Math_BigInteger/download
いいえ、その 16 進数は実際には md5 暗号化された結果です。
MD5 の結果を圧縮したいだけなので
テストコード
$c = md5('ffff');echo $c, PHP_EOL;echo $r = convert($c, 64), PHP_EOL;echo convert($r, -64);function convert($s, $to=64) { $dict = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@='; $res = ''; $b = ''; if($to > 0) { $to = ceil(log($to, 2));//调整到2的k次方 for($i=0; $i<strlen($s); $i++) $b .= sprintf('%04b', hexdec($s{$i})); while(strlen($b) >= $to) { $res = $dict{bindec(substr($b, -$to))} . $res; $b = substr($b, 0, -$to); } $res = $dict{bindec($b)} . $res; return $res; } $to = ceil(log(-$to, 2)); for($i=0; $i<strlen($s); $i++) $b .= sprintf("%0{$to}b", strpos($dict, $s{$i})); while(strlen($b) > 4) { $res = $dict{bindec(substr($b, -4))} . $res; $b = substr($b, 0, -4); } if(bindec($b)) $res = $dict{bindec($b)} . $res; return $res;}
機能があるようで、押したいものを押して回すことができます。
いいえ、その 16 進数は実際には md5 暗号化の結果です
では、なぜ 16 進数なのでしょうか? Base64ってダメなの?
MD5 の結果を圧縮したいだけなので
テストコード
$c = md5('ffff');echo $c, PHP_EOL;echo $r = convert($c, 64), PHP_EOL;echo convert($r, -64);function convert($s, $to=64) { $dict = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@='; $res = ''; $b = ''; if($to > 0) { $to = ceil(log($to, 2));//调整到2的k次方 for($i=0; $i<strlen($s); $i++) $b .= sprintf('%04b', hexdec($s{$i})); while(strlen($b) >= $to) { $res = $dict{bindec(substr($b, -$to))} . $res; $b = substr($b, 0, -$to); } $res = $dict{bindec($b)} . $res; return $res; } $to = ceil(log(-$to, 2)); for($i=0; $i<strlen($s); $i++) $b .= sprintf("%0{$to}b", strpos($dict, $s{$i})); while(strlen($b) > 4) { $res = $dict{bindec(substr($b, -4))} . $res; $b = substr($b, 0, -4); } if(bindec($b)) $res = $dict{bindec($b)} . $res; return $res;}