2010-11-07 40 views
3

我有一些C#代碼看起來像這樣一個數字:如何強制PHP來像對待一個uint

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

代碼後,== 228 452 386

現在我正在努力把這種C#代碼PHP,但PHP的數量不溢出同樣的方式:

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

代碼後,美元== 4 523 419 682

在這兩個cels中,「url」被視爲一個ascii值的數組。返回相同的結果,直到$ a被添加到第二行的結果爲止。那時C#uint溢出至2.28億。 PHP變得「聰明」,並提出「正確」的答案。

但我想要C#給出的溢出答案。我該怎麼辦?

回答

0

它已經有一段時間和工作的答案已經提交,但我只是想強調進行拆包,你正在做一個簡單的方法:

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

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

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

我正在使用unpack()執行從二進制到uint32(機器字節順序)的轉換。在32位平臺上,最終結果可能會變爲負值,這就是爲什麼我還使用printf()來正確格式化結果。