Pergunta
list(,$nfields) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
A questão é: por que "N*"
E se substr
Deve retornar 4 bytes, e eles serão descompactados como n? E por que tarefa dupla?
Up: Este código faz parte de Esfinge Conector PHP nativo. Após alguns hackers de código, ficou claro que esse código extrai o número inteiro de 4 bytes. Mas lógica por trás da tarefa dupla e substr
/ N*
ainda não está claro para mim. Estou oferecendo uma recompensa para finalmente entender.
Solução
Precisamos ver o histórico de revisão do arquivo, mas algumas possibilidades são:
- Esses são os restos de um algoritmo anterior que foi progressivamente despojado de funcionalidade, mas nunca limpo.
- É o código de espaguete típico que todos produzimos depois de uma noite ruim.
- É uma otimização que acelera o código para seqüências de entrada grandes.
Estes são todos sinônimos:
<?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)) );
?>
Eu fiz o típico reprodução de mil e mil horas de referência com três números inteiros e 1 é muito mais rápido. No entanto, um teste semelhante com 10.000 números inteiros mostra que 1 é o mais lento:-!
0.82868695259094 seconds
0.0046610832214355 seconds
0.0029149055480957 seconds
Sendo um mecanismo de texto completo, onde o desempenho é obrigatório, eu ousaria dizer que é uma otimização.
Outras dicas
O código é provavelmente um bug. Este tipo de loop é precisamente a razão pela qual *
existe...
descompactar ("n*", substr ($ resposta, $ p, 4));
Especifica o formato a ser usado ao descompactar os dados de substr ()
N - Longo não assinado, sempre 32 bits, Big Endian Byte Order