1

私は次のPHP関数を与えられ、それを逆にする別の関数を書くように頼まれました。

function convertTo16bit($ipString) {
    $ipString = explode(".", $ipString);

    $ip = ($ipString[0] << 24) | ($ipString[1] << 16) | ($ipString[2] << 8) | ($ipString[3]);
    $lowNumber = $ip & 0xffff;
    $highNumber = ($ip >> 16) & 0xffff;
    return array($lowNumber , $highNumber );
}

最初の質問:上記のコードが何をしているのかは理解できますが、その理由はわかりません。たとえば、lowNumberとhighNumberを作成する必要がある理由を誰かが説明できますか?

次に、上記で出力されたものと同様の配列を取り、IPアドレスの形式で文字列を返す「convertToIPAddress」という関数を作成する必要があります。誰かが私を正しい方向に向けることができますか?

ありがとう

4

3 に答える 3

2

これらの関数を自分で作成する必要はありません。あなたはその目的のためにip2long()そして使うことができます。long2ip()

上部と下部の理由は、32ビットシステム(または64ビットWindows)では、整数がすべての可能な値を保持するのに十分な大きさではないためです。上記のPHP関数は、同じビットが設定されている負の数を返すことでそれを「解決」します。

PHPの整数型は符号付きであり、多くのIPアドレスは32ビットアーキテクチャで負の整数になるため、符号なしIPアドレスの文字列表現を取得するには、sprintf()またはprintf()の「%u」フォーマッタを使用する必要があります。 。(出典: http: //php.net/ip2long

于 2012-08-23T09:16:06.843 に答える
1

私はこのコードを書きました:

<?php

function convertTo16bit($ipString) {
    $ipString = explode(".", $ipString);

    $ip = ($ipString[0] << 24) | ($ipString[1] << 16) | ($ipString[2] << 8) | ($ipString[3]);
    $lowNumber = $ipString & 0xffff;
    $highNumber = ($ipString >> 16) & 0xffff;
    return array($lowNumber , $highNumber );
}

$ip = "192.168.1.17";

var_dump($ip);
var_dump(convertTo16bit($ip));

?>

そして受け取った:

string '192.168.1.17' (length=12)

array (size=2)
  0 => int 1
  1 => int 0

この機能は正しくないと思います。使用しないでください。

于 2012-08-23T09:18:34.760 に答える
0

私はそれを考え出した...

function convert16BitIntsToIP($startingArray) {
    $low = $startingArray[0];
    $high  = $startingArray[1];

    $base = $high << 16 | $low;

    $ip1 = $base >> 24 & 0x00ff;
    $ip2 = $base >> 16 & 0x00ff;
    $ip3 = $base >> 8 & 0x00ff;
    $ip4 = $base & 0x00ff;

    $ip = "$ip1.$ip2.$ip3.$ip4";

   return $ip;
   }
于 2012-09-11T22:31:28.917 に答える