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

問題は、なぜ4バイトを返す"N*"必要substrがあり、それらがNとしてアンパックされるのかということです。そして、なぜ二重割り当て?

UPD:このコードはSphinxネイティブPHPコネクターの一部です。いくつかのコードハッキングの後、このコードが4バイト整数を抽出することが明らかになりました。substrしかし、二重割り当ておよび/の背後にあるロジックN*はまだ私にはわかりません。私はついにそれを理解するための報奨金を提供しています。

4

3 に答える 3

1

ファイルの改訂履歴を確認する必要がありますが、いくつかの可能性は次のとおりです。

  1. これらは、機能が徐々に削除されたが、クリーンアップされなかった以前のアルゴリズムの残骸です。
  2. これは、私たち全員が悪い夜の後に作成する典型的なスパゲッティコードです。
  3. これは、大きな入力文字列のコードを高速化する最適化です。

これらはすべて同義語です。

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

?>

私は、3つの整数を使用して、典型的な1000回の繰り返しベンチマークを実行しましたが、 1の方がはるかに高速です。ただし、10,000の整数を使用した同様のテストでは、1が最も遅いことが示されています:-!

0.82868695259094 seconds
0.0046610832214355 seconds
0.0029149055480957 seconds

パフォーマンスが必須のフルテキストエンジンなので、あえて最適化だと思います。

于 2010-01-14T18:00:03.380 に答える
0

コードはおそらくバグです。この種のループがまさに存在する理由*です...

于 2010-01-12T14:11:57.523 に答える
0

unpack( "N *"、substr($ response、$ p、4));

substr()からデータを解凍するときに使用する形式を指定します

N-unsigned long、常に32ビット、ビッグエンディアンバイトオーダー

于 2010-01-14T23:18:02.267 に答える