Question

list(,$nfields) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;

La question est, pourquoi "N*" si substr doit retourner 4 octets, et ils seront déballées N? Et pourquoi double affectation?

UPD : Ce code fait partie Sphinx connecteur natif de PHP. Après un certain piratage code, il est devenu clair que ce code extrait entier de 4 octets. Mais la logique derrière double affectation et substr / N* ne sait pas encore pour moi. Je propose une prime de comprendre enfin.

Était-ce utile?

La solution

Nous aurions besoin de voir l'historique des révisions du fichier, mais certaines possibilités sont:

  1. Ce sont les restes d'un algorithme précédent qui a été progressivement dépouillées de fonctionnalité mais jamais nettoyée.
  2. Il est le code typique de spaghettis que nous produisons tous après une mauvaise nuit.
  3. Il est une optimisation qui accélère le code pour les grandes chaînes d'entrée.

Ce sont tous les synonymes:

<?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)) );

?>

Je l'ai fait la répétition d'un mille fois typique de référence avec trois entiers et 1 est beaucoup plus rapide. Toutefois, un test similaire avec 10.000 entiers montre que 1 est le plus lent: -

0.82868695259094 seconds
0.0046610832214355 seconds
0.0029149055480957 seconds

Être un moteur de texte intégral où la performance est un must, j'ose dire que c'est une optimisation.

Autres conseils

Le code est probablement un bug. Ce type de boucle est précisément la raison pour laquelle existe * ...

  

Déballez ( "N *", substr ($ response, $ p,   4));

Indique le format à utiliser lors du déballage des données de substr ()

N - unsigned long, toujours 32 bits, grand ordre endian

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top