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.

È stato utile?

Soluzione

avremmo bisogno di vedere la cronologia delle revisioni del file, ma alcune possibilità sono:

  1. Questi sono i resti di un algoritmo precedente che è stato progressivamente spogliato di funzionalità, ma mai ripulita.
  2. E 'il codice di spaghetti tipico tutti noi produciamo, dopo una brutta notte.
  3. 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

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