質問
list(,$nfields) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
問題は、なぜです "N*"
もしも substr
4バイトを返す必要があり、それらはnとして開梱されますか?そして、なぜ二重の割り当てですか?
upd: :このコードはの一部です スフィンクス ネイティブPHPコネクタ。一部のコードハッキングの後、このコードが4バイト整数を抽出することが明らかになりました。しかし、二重割り当ての背後にあるロジックと substr
/ N*
まだ私には不明です。私は最終的にそれを理解するために賞金を提供しています。
解決
ファイルの改訂履歴を確認する必要がありますが、いくつかの可能性は次のとおりです。
- これらは、機能性を徐々に剥奪されたが、クリーンアップされなかった以前のアルゴリズムの遺跡です。
- それは私たち全員が悪い夜を過ごした後に生産する典型的なスパゲッティコードです。
- これは、大きな入力文字列のコードを高速化する最適化です。
これらはすべて同義語です。
<?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つの整数と典型的な繰り返しのベンチマークを行いました 1 はるかに速いです。ただし、10,000の整数を含む同様のテストは、 1 最も遅いです: - !
0.82868695259094 seconds
0.0046610832214355 seconds
0.0029149055480957 seconds
パフォーマンスが必須であるフルテキストエンジンであるため、最適化だと思います。
他のヒント
コードはおそらくバグです。この種のループがまさにその理由です *
存在する...
uppack( "n*"、substr($ response、$ p、4));
substr()からデータを開梱するときに使用する形式を指定します
n-署名されていない長い、常に32ビット、ビッグエンディアンバイトオーダー
所属していません StackOverflow