ホームページ  >  記事  >  バックエンド開発  >  PHPがip2longを使用する場合の負の数の解決策

PHPがip2longを使用する場合の負の数の解決策

*文
*文オリジナル
2018-01-02 17:16:001764ブラウズ

PHPでip2longを使用するときに負の数の問題を解決するにはどうすればよいですか?この記事ではphp ip2longで負の数が出る原因と解決策を中心に紹介します。みんなで共有して参考にしてください。お役に立てれば幸いです。

php は、IP アドレスを処理するための ip2long メソッドと long2ip メソッドを提供します。

1, ip2long - IPV4 文字列インターネットプロトコルをデジタル形式に変換します

int ip2long ( string $ip_address )

パラメータ: ip_address 標準形式のアドレス。

戻り値: IPアドレスを変換した数値、またはip_addressが無効な場合はFALSEを返します。

2、long2ip - 数値フォーマットを IPV4 の文字列インターネットプロトコルに変換します

string long2ip ( string $proper_address )

パラメータ: proper_address 長整数の正しいアドレス表現。

戻り値: インターネットアドレスを文字列として返します。

3.

<?php
$ip = &#39;10.1.1.1&#39;;
$ip_long = ip2long($ip);
echo $ip_long.PHP_EOL; // 167837953
echo long2ip($ip_long); // 10.1.1.1
?>

の使用方法4. 負の数の理由と解決策

IP アドレスが比較的大きい場合、ip2long は負の数になります:

<?php
$ip = &#39;192.168.101.100&#39;;
$ip_long = ip2long($ip);
echo $ip_long.PHP_EOL; // -1062705820
echo long2ip($ip_long); // 192.168.101.100
?>

原因の説明:

IPv4 は署名のない 32 ビット アドレスを使用するため、最大でも 2 の 32 乗マイナス 1 (4294967295) 個のアドレスが存在します。 10 進数は小数点以下 4 桁で区切って記述します。

A.B.C.D としてマークされます (例: 192.168.100.100)。

IPv4 アドレスの各 10 進数は、0 から 255 の範囲の符号なしバイトです。IPv4 アドレスを符号なしの数値に変換するということは、実際には、各 10 進数を対応する 8 ビットに配置して 4 バイトの符号なし整数を形成することを意味します。 192.168.100.100、上位 8 桁が 192,168、下位 8 桁が 100,100。

C 実装例:

#include <stdio.h>

int main(int argc, char** argv)
{
  unsigned int ip_long = (192 << 24) | (168 << 16) | (100 << 8) | 100;
  printf("%u\n", ip_long);
  printf("%d\n", ip_long);

  return 0;
}

fdipzone@ubuntu:~/C$ gcc -o ip2long ip2long.c
fdipzone@ubuntu:~/C$ ./ip2long
3232261220
-1062706076

ip_long が符号なし整数として宣言されている場合でも、出力を符号なし整数としてフォーマットするには、出力時に %u を指定する必要があることがわかります。

192は127(2進数は01111111)より大きいので、192(8ビット)は2進数で表現され、最上位ビットは1でなければなりません。結果として、この 4 バイト整数の最上位ビットは 1 になります。

ip_long は符号なし整数として定義されていますが、printf メソッドはその宣言を無視します。したがって、出力には %u 形式を使用する必要があります。最上位ビットが 0 の場合は、%d を使用します。

別の例:

ip:112.24.55.99

#include <stdio.h>

int main(int argc, char** argv)
{
  unsigned int ip_long = (112 << 24) | (24 << 16) | (55 << 8) | 99;
  printf("%u\n", ip_long);
  printf("%d\n", ip_long);

  return 0;
}
fdipzone@ubuntu:~/C$ gcc -o ip2long ip2long.c
fdipzone@ubuntu:~/C$ ./ip2long
1880635235
1880635235

解決策:

出力時に符号なし整数としてフォーマットするには %u を使用します。

<?php
$ip = &#39;192.168.101.100&#39;;
$ip_long = sprintf(&#39;%u&#39;,ip2long($ip));
echo $ip_long.PHP_EOL; // 3232261476 
echo long2ip($ip_long); // 192.168.101.100
?>

関連する推奨事項:

PHP はユーザークライアントの実際の IP をどのように取得しますか

PHP はソルテッドイメージ暗号化を実装します

PHP が MySQL のデッド接続を処理する方法

以上がPHPがip2longを使用する場合の負の数の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。