1

私はこのようなコードを持っていました:

$alias = 'myalias';
echo "<pre>";
echo "
ALIAS: $alias
ROUND: ", intval($alias, 36) , "\n" ,
"AGAIN: ", base_convert(intval($alias, 36), 10, 36)
;

echo "<hr>";

$alias = '27xk3q';
echo "<pre>";
echo "
ALIAS: $alias
ROUND: ", intval($alias, 36) , "\n" ,
"AGAIN: ", base_convert(intval($alias, 36), 10, 36)
;

これは以前は機能していましたが、今でも私の自宅のMacコンピューターで機能します。出力は次のとおりです。

ALIAS: myalias
ROUND: 2147483647
**AGAIN: zik0zj**

ALIAS: 27xk3q
ROUND: 134255366
AGAIN: 27xk3q

しかし、これをLinuxサーバーにアップロードすると、さまざまなエコーが発生します。

ALIAS: myalias
ROUND: 49962861028
**AGAIN: myalias**

ALIAS: 27xk3q
ROUND: 134255366
AGAIN: 27xk3q

ご覧のとおり、「myalias」文字列は、LinuxバージョンのPHPではそれ自体として出力されます。

これが機能しないか、間違ったコードである場合、文字列が整数の有効なbase36バージョンであるかどうかをチェックする確実な方法を知る必要があります。

ありがとう!

4

2 に答える 2

2

ご覧のとおり、「myalias」文字列は、Linux バージョンの PHP ではそのまま出力されます。

そしてそれは正しい振る舞いです。Mac では別の結果が得られます。これは 32 ビットであり、番号が2147483647( 2^32 - 1)に切り捨てられているためです。

if (preg_match('~^[a-z\d]+$~', $string)) {
    // valid base36
}
于 2011-06-05T08:37:42.880 に答える
1

intvalあなたが抱えている問題は、マシンの1つが32ビットのsigned int(最初のもの)で動作していて、もう1つのマシンがその変換で64ビットのsigned int(またはそれ以上)で動作していることです。[inval範囲についてはドキュメントを参照してください。]

myaliasBase36 から変換された値は 0x7FFFFFFF (符号付き 32 ビットの最大値) を超えますが、64 ビットの符号付き int (0xba204c1e4 == 49962861028) では正確です。したがって、「壊れている」と思われるもの (Linux のもの) は、実際には正しいバージョンです。最初のものはオーバーフローのために機能していません。

char で構成されるすべての文字列0-9a-zは、有効な Base36 数値です。あなたができる唯一のチェックは、文字列内のすべての文字が有効な範囲内にあることをチェックすることです(そしてオーバーフローをチェックします(返された値が最大のintであるかどうかをテストします)-信頼できません)。

于 2011-06-05T08:44:27.713 に答える