찾다

 >  Q&A  >  본문

php - IP 주소가 어느 도시에 속하는지 확인하는 데 사용되는 코드에서 코드를 작성할 때 음수 값을 고려해야 하는 이유는 무엇입니까?

코드부터 시작하겠습니다. 원본 소스는 DZ여야 합니다.
제가 재능이 없어서 하나씩 분석해 본 적이 있습니다. 정말 이해할 수 없는 곳이 있다는 것을 발견했습니다. : if($ipbegin < 0) $ipbegin += pow(2, 32) // 어떤 상황에서 $ipbegin<0???
또 다른 문제는 이 함수가 qqwry.dat(처음에는 거의 bat로 작성됨)를 참조한다는 것입니다. 공식 웹사이트, 문서 설명, 사용 방법 등 이 파일의 원본 소스는 어디에 있습니까? , 간략한 소개만 있는데 아직 못찾았네요. 원하시는 답변입니다.

 공개 함수 qqwry($ip='222.222.222.222'){
        //$fd->resource(24, 스트림)
        if(!$fd = @fopen("./Public/qqwry.dat", 'rb')) {
            '잘못된 IP 데이터 파일'을 반환합니다.
        }
        $ip = 폭발('.', $ip);
        //$ipNum=2079656996
        $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];

        //IP 주소 인덱스의 시작 위치와 끝 위치를 가져옵니다. 이때 두 변수의 출력은 왜곡됩니다(바이너리여야 함).
        if(!($DataBegin = fread($fd, 4)) || !($DataEnd = fread($fd, 4)) ){
            반품;
        }

        // unpack() 함수는 이진 문자열 L(부호 없는 긴 정수)에서 데이터를 압축 해제합니다.
        // implode — 배열 요소를 문자열과 결합합니다.
        @$ipbegin = implode('', unpack('L', $DataBegin));// 6153398

        //pow(x,y)--pow() 함수는 x의 y제곱을 반환합니다.
        if($ipbegin < 0) $ipbegin += pow(2, 32); // 어떤 상황에서 $ipbegin<0 ???


        // implode — 배열 요소를 문자열과 결합합니다.
        @$ipend = implode('', unpack('L', $DataEnd));

        if($ipend < 0) $ipend += pow(2, 32);
        $ipAllNum = ($ipend - $ipbegin) / 7 + 1;

        $BeginNum = $ip2num = $ip1num = 0;
        $ipAddr1 = $ipAddr2 = '';
        $EndNum = $ipAllNum;

        while($ip1num > $ipNum || $ip2num < $ipNum) {
        //다음은 이분법의 큰 부분이므로 복사하지 않겠습니다
淡淡烟草味淡淡烟草味2780일 전799

모든 응답(1)나는 대답할 것이다

  • 某草草

    某草草2017-05-16 13:13:08

    • IP는 32비트로 바이너리로 표현되므로 int도 32비트로 숫자를 사용하여 IP를 저장하므로 검색 효율성과 저장 공간이 더 좋습니다

    • int의 첫 번째 숫자는 양수와 음수를 나타냅니다. 그러니 음수를 갖는 것이 정상입니다

    회신하다
    0
  • 취소회신하다