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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top