私はすでにIPv4に対してこれを「実行」しました。
$ip = '127.0.0.1'; // example
$ip = explode('.',$ip);
if( count($ip) != 4 ) $ip = array(0,0,0,0); // wrong ip format, default to 0.0.0.0
return chr($ip[0]) . chr($ip[1]) . chr($ip[2]) . chr($ip[3]);
IPv6でも上記を行う必要があります。IPv6 仕様を読んで (すべてを読んだわけではないことは認めます)、0 のセットを 2 つのコロンに圧縮できるなど、いくつかの奇妙な点 (「例外」) を見つけました: ":0000:0000"=> "::" (私の理解が正しければ)。また、IPv6 文字列内に IPv4 スタイルの文字列を含める方法も見ました: 0:0:0:0:0:0:127.0.0.1
どこから始めればいいのかわからないということから始めましょう。
Alvaro のおかげで、inet_pton の純粋な PHP 実装を手に入れることができました。
/**
* @copyright 2004-2007 Aidan Lister <aidan@php.net>, Arpad Ray <arpad@php.net>
* @link http://php.net/inet_pton
* @author Arpad Ray <arpad@php.net>
*/
function php_compat_inet_pton($address) {
$r = ip2long($address);
if ($r !== false && $r != -1) return pack('N', $r);
$delim_count = substr_count($address, ':');
if ($delim_count < 1 || $delim_count > 7) return false;
$r = explode(':', $address);
$rcount = count($r);
if (($doub = array_search('', $r, 1)) !== false) {
$length = (!$doub || $doub == $rcount - 1 ? 2 : 1);
array_splice($r, $doub, $length, array_fill(0, 8 + $length - $rcount, 0));
}
$r = array_map('hexdec', $r);
array_unshift($r, 'n*');
$r = call_user_func_array('pack', $r);
return $r;
}
問題は、それが何をしているのかよく理解できないことです。問題は、(1 つの理由として) 私が行っている (またはしたい) ものとは異なる形式で IP をパックしていることを知っているので、そのような関数を使用することはできないということです。