3

JavaScript スニペットを PHP に変換しようとしています。Javascriptは

var sum1 = 0, sum2 = 0;
for (var i = domain.length - 1; i >= 0; i--) {
    sum1 += domain.charCodeAt(i) * 13748600747;
    sum2 += domain.charCodeAt(i) * 40216416130;
}

var x = ("$" + sum1).substring(0, 8) + ("" + sum2).substring(0, 8);

しかし、この部分を理解できませんでしsum1 += domain.charCodeAt(i) * 13748600747;た。つまり、domain.charCodeAt(i) の代わりにどの PHP 関数を使用できるかということです。

編集:

私のPHPコード:

$domain = "example.com";
$sum1 = 0;
$sum2 = 0;
$length = strlen($domain);
$i = $length - 1;
for ( $i; $i >= 0; $i-- ) {
    $sum1 += ord($domain[$i]) * 13748600747;
    $sum2 += ord($domain[$i]) * 40216416130;
}
$newsum = "$".$sum1;
$x = substr($newsum,0,8) + substr($sum2,0,8);

echo $x;

出来上がりが断然違います。助けが必要。

4

3 に答える 3

4

これは Unicode セーフ バージョンである必要があります。

$domain = "example.com";
$sum1 = 0;
$sum2 = 0;

// this will convert $domain to a UTF-16 string,
// without specifying the third parameter, PHP will
// assume the string uses PHP's internal encoding,
// you might want to explicitly set the `from_encoding`
$domain = mb_convert_encoding($domain, 'UTF-16');

$length = mb_strlen($domain, 'UTF-16');
$i = $length - 1;

for ( $i; $i >= 0; $i-- ) {
    $char = mb_substr($domain, $i, 1, 'UTF-16');
    $sum1 += hexdec(bin2hex($char)) * 13748600747;
    $sum2 += hexdec(bin2hex($char)) * 40216416130;
}
$newsum = "$" . strval($sum1);
$sum2 = strval($sum2);
$x = substr($newsum,0,8) . substr($sum2,0,8);

echo $x;

10 進数への変換は、ドキュメントのこのコメントのコードに基づいています。ord

于 2013-03-17T06:30:12.687 に答える
3

ord() は ascii でしか機能しませんが、javascript は utf-16 を使用するため、

hexdec(bin2hex($utf16_char))

これが私が行った実験です:

// This is a utf8 character because my editor can only accept utf8
$utf8_char = "北";
// convert to utf16 using mb_convert_encoding()
$utf16_char = mb_convert_encoding($utf8_char, "utf-16", "utf-8");

// output is correct: int(21271), same as javascript output
var_dump(hexdec(bin2hex($utf16_char)));

// output is wrong: int(83) because ord() only works for ascii character.
var_dump(ord($utf16_char));

注: 上記の js コードを完全に置き換えるには、mbstring モジュールを使用し、内部エンコーディングとして utf-16 を設定することをお勧めします。

mb_internal_encoding('utf-16');

次に、mb_* 関数を使用します。たとえば、strlen() の代わりに mb_strlen() を使用します。また、php 関数に utf16 文字列をフィードします。

[更新]問題をよりよく理解するために、次の2行は同等であることに注意してください。

hexdec(bin2hex($any_utf_char));
(int) base_convert(unpack("H*", $any_utf_char)[1], 16, 10); // Note: the array dereferencing only works in php5.4
于 2013-03-17T05:50:18.200 に答える
2

それはord($domain[$i])

于 2013-03-17T04:07:27.803 に答える