Changeset 888 for trunk/Packages/Common/NetworkAddress.php
- Timestamp:
- Dec 27, 2022, 7:50:23 PM (2 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Packages/Common/NetworkAddress.php
r880 r888 1 1 <?php 2 3 define('IPV4_BIT_WIDTH', 32); 2 4 3 5 class NetworkAddressIPv4 4 6 { 5 var$Address;6 var$Prefix;7 public int $Address; 8 public int $Prefix; 7 9 8 10 function __construct() … … 12 14 } 13 15 14 function GetNetMask() 16 function GetNetMask(): int 15 17 { 16 return 0xffffffff ^ ((1 << (32- $this->Prefix)) - 1);18 return ((1 << IPV4_BIT_WIDTH) - 1) ^ ((1 << (IPV4_BIT_WIDTH - $this->Prefix)) - 1); 17 19 } 18 20 19 function AddressToString() 21 function AddressToString(): string 20 22 { 21 23 return implode('.', array(($this->Address >> 24) & 255, ($this->Address >> 16) & 255, ($this->Address >> 8) & 255, ($this->Address & 255))); 22 24 } 23 25 24 function AddressFromString( $Value)26 function AddressFromString(string $Value): void 25 27 { 26 28 $Parts = explode('.', $Value); … … 28 30 } 29 31 30 function GetRange() 32 function GetRange(): array 31 33 { 32 34 $From = new NetworkAddressIPv4(); 33 35 $From->Address = $this->Address; 34 $From->Prefix = 32;36 $From->Prefix = IPV4_BIT_WIDTH; 35 37 $HostMask = 0xffffffff ^ $this->GetNetMask(); 36 38 $To = new NetworkAddressIPv4(); 37 39 $To->Address = $From->Address + $HostMask; 38 $To->Prefix = 32;40 $To->Prefix = IPV4_BIT_WIDTH; 39 41 return array('From' => $From, 'To' => $To); 40 42 } 41 43 42 function ChangePrefix( $NewPrefix)44 function ChangePrefix(int $NewPrefix): void 43 45 { 44 46 $this->Prefix = $NewPrefix; 45 if ($this->Prefix > 32) $this->Prefix = 32;47 if ($this->Prefix > IPV4_BIT_WIDTH) $this->Prefix = IPV4_BIT_WIDTH; 46 48 if ($this->Prefix < 0) $this->Prefix = 0; 47 49 $this->Address = $this->Address & $this->GetNetMask(); 48 50 } 49 51 50 function Contain( $Address)52 function Contain(NetworkAddressIPv4 $Address): bool 51 53 { 52 54 $UpperNetmask = $this->GetNetMask(); 53 55 if (($this->Prefix < $Address->Prefix) and (($Address->Address & $UpperNetmask) == ($this->Address & $UpperNetmask))) $Result = true; 54 56 else $Result = false; 55 //echo($Address->AddressToString().'/'.$Address->Prefix.' in '.$this->AddressToString().'/'.$this->Prefix.' '.$Result."\n");56 57 return $Result; 57 58 } 58 59 } 59 60 61 define('IPV6_BIT_WIDTH', 128); 62 60 63 class NetworkAddressIPv6 61 64 { 62 var$Address;63 var$Prefix;65 public string $Address; 66 public int $Prefix; 64 67 65 68 function __construct() … … 69 72 } 70 73 71 function AddressToString() 74 function GetNetMask(): string 75 { 76 return Int128Xor(Int128Sub(Int128Shl(IntToInt128(1), IntToInt128(IPV6_BIT_WIDTH)), IntToInt128(1)), 77 Int128Sub(Int128Shl(IntToInt128(1), IntToInt128(IPV6_BIT_WIDTH - $this->Prefix)), IntToInt128(1))); 78 } 79 80 function AddressToString(): string 72 81 { 73 82 return inet_ntop($this->Address); 74 83 } 75 84 76 function AddressFromString( $Value)85 function AddressFromString(string $Value) 77 86 { 78 87 $this->Address = inet_pton($Value); 79 88 } 80 89 81 function GetOctets() 90 function ChangePrefix(int $NewPrefix): void 91 { 92 $this->Prefix = $NewPrefix; 93 if ($this->Prefix > IPV6_BIT_WIDTH) $this->Prefix = IPV6_BIT_WIDTH; 94 if ($this->Prefix < 0) $this->Prefix = 0; 95 $this->Address = Int128And($this->Address, $this->GetNetMask()); 96 } 97 98 function GetOctets(): array 82 99 { 83 100 $Result = array(); … … 85 102 foreach ($Data as $Item) 86 103 { 87 88 104 $Result[] = dechex($Item & 15); 89 105 $Result[] = dechex(($Item >> 4) & 15); … … 92 108 } 93 109 94 function EncodeMAC( $MAC)110 function EncodeMAC(string $MAC): void 95 111 { 96 112 $MAC = explode(':', $MAC); … … 107 123 } 108 124 125 function Contain(NetworkAddressIPv6 $Address): bool 126 { 127 $UpperNetmask = $this->GetNetMask(); 128 if (($this->Prefix < $Address->Prefix) and ((Int128Equal(Int128And($Address->Address, $UpperNetmask), Int128And($this->Address, $UpperNetmask))))) $Result = true; 129 else $Result = false; 130 return $Result; 131 } 109 132 }
Note:
See TracChangeset
for help on using the changeset viewer.