Come forzare PHP per il trattamento di un numero come un uint
Domanda
Ho qualche codice C # che assomiglia a questo:
uint a = 0x9E3779B9;
a += (uint)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24));
Dopo che il codice, a == 228 452 386
Ora sto cercando di tradurre questo codice C # per PHP, ma in PHP il numero non traboccare allo stesso modo:
$a = 0x9E3779B9;
$a += ($url[$k+0] + ($url[$k+1] << 8) + ($url[$k+2] << 16) + ($url[$k+3] << 24));
Dopo che il codice, $ a == 4 523 419 682
In entrambi coses "URL" viene trattata come una matrice di valori ASCII. Le restituisce gli stessi risultati fino al momento $ a viene aggiunto al risultato della seconda linea. A quel punto il C # uint trabocca a ~ 228 milioni. PHP diventa "intelligente" e si presenta con la risposta "giusta".
Ma io voglio la risposta in overflow che C # dà. Cosa devo fare?
Soluzione
Aggiungere un $a &= 0xFFFFFFFF
per mettere la schiena valore nella gamma a 32 bit dopo aver fatto il +=
.
(Vedere: http://www.ideone.com/6BR0U )
Altri suggerimenti
E 'stato un po' ed è già stata presentata una risposta di lavoro, ma volevo solo mettere in evidenza un modo più semplice per eseguire l'estrazione, che si sta facendo:
$a = 0x9e3779b9;
$url = 'info';
$a = ($a + current(unpack('L', $url))) & 0xffffffff;
printf("%u\n", $a); // 228452387
unpack()
per eseguire la conversione da binario a Uint32 (ordine dei byte della macchina). Sulle piattaforme a 32 bit, il risultato finale può diventare negativo, che è per questo che sto utilizzando anche printf()
correttamente formattare il risultato.