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.

Foi útil?

Solução

Precisamos ver o histórico de revisão do arquivo, mas algumas possibilidades são:

  1. Esses são os restos de um algoritmo anterior que foi progressivamente despojado de funcionalidade, mas nunca limpo.
  2. É o código de espaguete típico que todos produzimos depois de uma noite ruim.
  3. É 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top