/** * An IP address (v4 or v6). */ class IPAddress { private var address4: Array = Array(4) { 0u } private var address6: Array = Array(16) { 0u } private var is4: Boolean /** * @throws NumberFormatException if the IP address follows neither the IPv4 syntax, nor the IPv6 syntax. */ constructor(address: String) { val split4 = address.split('.') val split6 = address.split(':') var bytes: List = emptyList() if (split4.size == 4) { bytes = split4.map { it.toUByte() } this.address4 = bytes.toTypedArray() this.is4 = true } else if (split6.size == 16) { bytes = split4.map { it.toUByte(16) } this.address6 = bytes.toTypedArray() this.is4 = false } else { throw NumberFormatException() } } override fun toString(): String { val str: String if (this.is4) { str = address4.joinToString(separator = ".") { it.toString() } } else { str = address6.joinToString(separator = ":") { it.toString() } } return str } }