PHP ikili (/ bellek) temsil IPv6 dönüştürme

0 Cevap php

Ben zaten IPv4 için bu "did";

$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]);

I need to do the above for IPv6 as well. Reading through the IPv6 spec, (I admit I didn't read all of it), I saw several oddities ("exceptions") such as a set of 0 could be compressed to a double colon: ":0000:0000"=>"::" (if my understanding was correct). I also saw how you can have an IPv4-style string inside an IPv6 string: 0:0:0:0:0:0:127.0.0.1

Diyelim ki nereden başlayacağımı hiç acayip bir fikrim var diyerek başlayalım.


Alvaro sayesinde, şimdi ben inet_pton saf-PHP uygulama var:

/**
 * @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;
}

Sorun oldukça ne yaptığını anlayamıyorum, olduğunu. Sorun ben just (bir şey) ben yapıyorum daha bir değişik formatta IP paketleme biliyorum (ya da istiyorum) beri böyle bir işlevi kullanamazsınız vardır.

0 Cevap