PHPのip2longについて

このQ&Aのポイント
  • 「ip2long」とは、インターネットプロトコルドット表記のアドレスを適当なアドレ スを有する文字列に変換する関数です。
  • 「適当なアドレ スを有する文字列」とは、アドレスを示す文字列のことです。
  • ip2long関数は、ロングIPアドレス(符号無しの10進数)を返します。
回答を見る
  • ベストアンサー

PHP「ip2long」について

「ip2long」について教えてください。 マニュアルを見ると「インターネットプロトコルドット表記のアドレスを適当なアドレ スを有する文字列に変換する」とありますが、「適当なアドレ スを有する文字列」とは何なんでしょうか? 以下のソースを実行すると画面に -800211802 が表示されますが、これが「適当なアドレ スを有する文字列」なのでしょうか? この文字列は何進数なんでしょうか? <?php $ip = gethostbyname('www.example.com'); echo(ip2long($ip)); ?> sprintf("%u", ip2long($ip)) とするとロングIPアドレス(符号無しの 10 進数)になるってことは10進数ではないのでしょうけど・・・ GoogleのIPアドレス 66.249.89.99 だと正の数値 1123637603 が返されます。 正と負の違いはなんなんでしょうか??? 宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

>66.249.89.99 だと正の数値 1123637603 この値を16進変換して全部繋げてそれを10進数に戻してごらん。 正負の違いは2進変換したときの最上位桁が0か1か。その辺りは2進数での正負の表現で調べてね。

kyouju
質問者

お礼

「01000010111110010101100101100011」 「11010000010011011011110010100110」 なんですね。。。 理解できました、ありがとうございます。

kyouju
質問者

補足

SAYKAさんありがとうございます。 ご教授いただきましたように2つのIPアドレスを変換してみました。 66.249.89.99 ↓ ↓16進数変換 ↓ 42F95963 ↓ ↓10進数変換 ↓ 1123637603 ↓ ↓2進数変換 ↓ 1000010111110010101100101100011 208.77.188.166 ↓ ↓16進数変換 ↓ D04DBCA6 ↓ ↓10進数変換 ↓ 3494755494 ↓ ↓2進数変換 ↓ 11010000010011011011110010100110 「66.249.89.99」→「1123637603」は納得できるのですが、「208.77.188.166」→「-800211802」は何故なんでしょうか??? 「208.77.188.166」→「3494755494」ではないのでしょうか。 2進変換したときの最上位桁は両方とも「1」ですよね?

関連するQ&A

  • 社内プロキシサーバーのIPアドレス

    お願いします。 社内における プロキシサーバの設定では、 アドレスの設定のところにIPアドレスではなく アドレス(文字列)を打つように指示されていますが、 (FQDN?) IPアドレスをこの文字列から得ることはできるのでしょうか?

  • IPアドレスとNetmaskの関係

    例えば222.222.16.0/22等の表記の場合、この表記が表すIPアドレスの範囲はどこからどこまででしょうか。 当方の計算ではこの表記に含まれるホストのIPアドレスの数は全部で320個でした。すると222.222.16.0~222.222.16.255, 222.222.17.0~222.222.17.63と言う理解で良いのでしょうか。そもそも320個のIPアドレスがあるという結果もただしいのかいなか判然としません。 単純に8ビットの文字列で256を表すので在れば、1ビットは32個を表すと考えまして、10ビット分で320個と判断したのですが、正しいでしょうか。

  • 文字列の配列

    文字列の配列 1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4 のようにIPアドレスが一行に一つづつ書き込まれたテキストがあります。 ここから、それぞれのIPアドレスを文字列として配列に書き込みたいのですが、どうしたらよいのでしょうか。 IPアドレスの数だけ配列を始めに宣言して、それぞれに書き込んでいくのでは手間がかかりすぎてしまいます。 単純に数値の羅列なら scanfを使い、配列に格納できるのですが、文字列になるとどうしたらいいのかわかりません。 よろしくお願いいたします。

  • IPアドレス リムネット

    リムネットのIPアドレスは、どういう文字列になるのでしょうか? どなたかご存知の方教えてください。 地域などによって違いがありますか? よろしくお願いします。

  • ipconfigでIPアドレスを調べたら2001:a092:87e9,,,

    先日IPアドレスを調べてみたら Connection-specific DNS Suffix .: IP Address. . . . . . . . . :192.168.*.* Subnet Mask. . . . . . . . :255.255.255.0 IPAddress. . . . . . . . . :2001.a092:87e9:0:~ IP Address. . . . . . . . .:2001:a092:87e9:0:~ IP Address. . . . . . . . .:fe80::212:3fff:~ Default Gateway. . . . . . :192.168.*.* (~には以下同じような文字列の羅列) (*には普通のIPアドレス数値) といったように意味不明な文字列がでてきてたのですが、、、。 これはどこかが壊れているのでしょうか? 最悪OS再インストールも必要なのでしょうか? ちなみにOSはWindows XP SP2です。 分かる方がいましたらよろしくお願いします。

  • windowsシステムエラー

    インターネットをしていると、windows システムエラ ー(ネットワーク上の別のシステムと競合するipアドレ スがあります)って出るんですけど、何でですか? 僕の見解は、前にweb.setupというページを開いて、 ipアドレスなどをそこに入力したからだと思うんですけ ど、それ以来そのページにアクセスできなくなりまし た。だれか、windowsシステムエラーを直す方法と web.setupにアクセスできる方法を教えてください。 これが原因で、ダウンロードなどができません

  • PHPで作成するジェネレーターでのご質問

    以前も相談させていただいたのですが、 ツイッター診断メーカーに似たものを作成しています。 http://shindanmaker.com/ そこである程度は完成したのですが、1点だけどうしても作成方法が分からず、 その部分をご相談させてもらいたいです。 以下にソースコピペします。 //textAraryには50個ほどの文字列が入っています。 $txtNum = count($textArray); //文字列を10進数に $num = sprintf("%u",crc32($click)); 10進数を配列の数で割り、余りを求める $i= $num % $txtNum; $finish = $textArray[$i]; 抜粋なのですが、上記のソースで実装するとちゃんと意図した動作するのですが、 診断用の異なるニックネームを何回か入力すると、 かなりの確率でfinishに同じ文字列が抽出されてしまいます。 出来る限り、バラけさせたいのですが、 何か良いロジックはありますでしょうか。 当方頭が回らず、、お知恵を拝借できればと幸いです。。 また、参考になるサイトでも結構ですので、 ご教授の程、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 現在PHPで診断メーカー的なものを作成しています。

    現在PHPで診断メーカー的なものを作成しています。 そこで、PHPの技術的なことでご質問です。 //$textArrayには50個程の文字列が入っています。 $txtNum = count($textArray); //$clickは入力された名前です。 $num = sprintf("%u",crc32($click)); //1個目の度の番号 $i= $num % $txtNum; //2個目の度の番号 $num2 = sprintf("%u",crc32($textArray[$i])); $i2 = $num2 % $txtNum; //3個目の度の番号 $num3 = sprintf("%u",crc32($textArray[$i2])); $i3 = $num3 % $txtNum; echo $i.'--'.$i2.'--'.$i3; 上記のように、名前に対して固定された文字列を配列から3つ抽出しています。 i,i2,i3ともにそれぞれ被らない数字にしたいのですが、上記のようにやると入力された名前によってはi,i2,i3でそれぞれ数字が被る場合があります。 これを被らないようにするには何か方法がありますでしょうか。 10進数を剰余代入することで、配列の中の数の範囲内で数字を抽出しています。 ばったりと詰まってしまい、ヒント等もらえますと幸いです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • IPアドレスから個人特定は不可能、というデマは

    あの情報は出所は結局はどこなんでしょうか。 2chのコピペが真実として広まったんですか。 IPV6はIPアドレスの文字列が実質固定でしか使われないから匿名性がないと聞きました。

  • Perlの数値・文字列操作

    Perlで以下の16進数の連続した文字列を db444500 配列に入れて後からわかりやすい16進数で表示させたり、 foreach (@list){ print sprintf("%02X ", $_); } 直接文字列として、 0xdb, 0x44, 0x45, 0x00 と表示させるには、どのような書き方をすれば良いのでしょうか?

    • ベストアンサー
    • Perl

専門家に質問してみよう