質問

このように見えるC#コードがいくつかあります。

uint a = 0x9E3779B9;
a += (uint)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24));

そのコードの後、a == 228 452 386

今、私はこのC#コードをPHPに翻訳しようとしていますが、PHPでは同じ方法で数値がオーバーフローしません。

$a = 0x9E3779B9;
$a += ($url[$k+0] + ($url[$k+1] << 8) + ($url[$k+2] << 16) + ($url[$k+3] << 24));

そのコードの後、$ a == 4 523 419 682

両方のCOSESでは、「URL」はASCII値の配列として扱われます。 2番目の行の結果に$ aが追加されるまで、同じ結果が同じ結果を返します。その時点で、C#UINTは約2億2,800万人にオーバーフローします。 PHPは「賢い」となり、「正しい」答えを思いつきます。

しかし、私はC#が与える溢れた答えを望んでいます。私は何をすべきか?

役に立ちましたか?

解決

Aを追加します $a &= 0xFFFFFFFF あなたが行った後に値を32ビットの範囲に戻すために +=.

(見る: http://www.ideone.com/6br0u)

他のヒント

しばらく経ちましたが、機能した回答はすでに提出されていますが、私はあなたがしている開梱を実行する簡単な方法を強調したかっただけです。

$a = 0x9e3779b9;
$url = 'info';

$a = ($a + current(unpack('L', $url))) & 0xffffffff;

printf("%u\n", $a); // 228452387

私は使用しています unpack() バイナリからUINT32(マシンバイトの順序)への変換を実行します。 32ビットのプラットフォームでは、エンドルルトがネガティブになる可能性があるため、私も使用しています printf() 結果を適切にフォーマットします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top