문제
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
성능이 필수 인 전체 텍스트 엔진이기 때문에 최적화라고 감히 말할 것입니다.
다른 팁
코드는 아마도 버그 일 것입니다. 이런 종류의 루프는 정확히 그 이유입니다 *
존재하는 ...
포장 풀 ( "n*", substr ($ 응답, $ p, 4));
substr ()에서 데이터를 풀 때 사용할 형식을 지정합니다.
n- 서명되지 않은 길고, 항상 32 비트, 큰 엔디 어 바이트 순서
제휴하지 않습니다 StackOverflow