문제

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

문제는 이유입니다 "N*" 만약에 substr 4 바이트를 반환해야하며 N으로 포장되지 않습니까? 그리고 왜 이중 과제입니까?

upd:이 코드는의 일부입니다 스핑크스 기본 PHP 커넥터. 일부 코드 해킹 후이 코드가 4 바이트 정수를 추출한다는 것이 분명해졌습니다. 그러나 이중 할당의 논리 substr / N* 여전히 나에게 불분명합니다. 나는 마침내 그것을 이해하기 위해 현상금을 제공하고 있습니다.

도움이 되었습니까?

해결책

파일의 개정 내역을 볼 필요가 있지만 일부 가능성은 다음과 같습니다.

  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 개의 정수와 1 더 빠릅니다. 그러나 10,000 정수의 비슷한 테스트에서 1 가장 느리게 :-!

0.82868695259094 seconds
0.0046610832214355 seconds
0.0029149055480957 seconds

성능이 필수 인 전체 텍스트 엔진이기 때문에 최적화라고 감히 말할 것입니다.

다른 팁

코드는 아마도 버그 일 것입니다. 이런 종류의 루프는 정확히 그 이유입니다 * 존재하는 ...

포장 풀 ( "n*", substr ($ 응답, $ p, 4));

substr ()에서 데이터를 풀 때 사용할 형식을 지정합니다.

n- 서명되지 않은 길고, 항상 32 비트, 큰 엔디 어 바이트 순서

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top