Domanda
list(,$nfields) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
La domanda è, perché se "N*"
substr
deve restituire 4 byte, e saranno spacchettati come N? E perché doppia assegnazione?
UPD : Questo codice fa parte di Sfinge connettore PHP nativa. Dopo un po 'di codice di hacking è diventato chiaro che questo codice estrae intero di 4 byte. Ma la logica dietro la doppia assegnazione e substr
/ N*
è ancora chiaro per me. Sto offrendo una taglia di capire finalmente.
Soluzione
avremmo bisogno di vedere la cronologia delle revisioni del file, ma alcune possibilità sono:
- Questi sono i resti di un algoritmo precedente che è stato progressivamente spogliato di funzionalità, ma mai ripulita.
- E 'il codice di spaghetti tipico tutti noi produciamo, dopo una brutta notte.
- Si tratta di un'ottimizzazione che accelera il codice per i grandi stringhe di input.
Questi sono tutti sinonimi:
<?php
$packed = pack('N*', 100, 200, 300);
// 1
var_dump( unpack('N*', $packed) );
// 2
var_dump( unpack('N*', substr($packed, 0, 4)) );
var_dump( unpack('N*', substr($packed, 4, 4)) );
var_dump( unpack('N*', substr($packed, 8, 4)) );
// 3
var_dump( unpack('N', substr($packed, 0, 4)) );
var_dump( unpack('N', substr($packed, 4, 4)) );
var_dump( unpack('N', substr($packed, 8, 4)) );
?>
Ho fatto il tipico repeat-a mille volte di benchmark con tre numeri interi e 1 è il modo più veloce. Tuttavia, un test simile con 10.000 numeri interi mostra che 1 è la più lenta: -!
0.82868695259094 seconds
0.0046610832214355 seconds
0.0029149055480957 seconds
Essendo un motore full-text in cui le prestazioni è un must, oserei dire che è un'ottimizzazione.
Altri suggerimenti
Il codice è probabilmente un bug. Questo tipo di ciclo è precisamente il motivo per cui esiste *
...
unpack ( "N *", substr ($ risposta, $ p, 4));
Specifica il formato da utilizzare quando si scompatta i dati substr ()
N - unsigned long, sempre a 32 bit, byte order big endian