diff options
author | Edoardo La Greca | 2025-06-20 02:52:01 +0200 |
---|---|---|
committer | Edoardo La Greca | 2025-06-20 02:52:01 +0200 |
commit | 50f323a54ed605d220e68bc07341698f2a0b0aaf (patch) | |
tree | 4e9b08139f9cb131c331a6b8c2e405cd60568a65 | |
parent | bbb3a475b0c7b7d2b5423098567f094b0e263a6e (diff) |
improve IPAddress constructor and make isAddressV4 and isAddressV6 private
-rw-r--r-- | src/main/kotlin/IPAddress.kt | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/src/main/kotlin/IPAddress.kt b/src/main/kotlin/IPAddress.kt index 5707ced..58d0aae 100644 --- a/src/main/kotlin/IPAddress.kt +++ b/src/main/kotlin/IPAddress.kt @@ -9,9 +9,6 @@ class IPAddress { * @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(':') - if (isAddressV4(address)) { this.is4 = true } else if (isAddressV6(address)) { @@ -20,24 +17,48 @@ class IPAddress { throw NumberFormatException() } - var bytes: List<Byte> = if (this.is4) { - split4.map { it.toByte(10) } + val split4 = address.split('.') + val split6 = address.split(':') + val bytes: List<Byte> + if (this.is4) { + bytes = split4.map { it.toByte(10) } } else { - split6.map { it.toByte(16) } + val shorts = split6.map { it.toShort(16) } + bytes = shorts.flatMap { + listOf( + it.toInt().shr(8).toByte(), + it.toInt().and(0x00FF).toByte() + ) + } } this.address = bytes.toTypedArray() } - fun isAddressV4(address: String): Boolean { + private fun isAddressV4(address: String): Boolean { val split4 = address.split('.') - return split4.size == 4 && - split4.size == split4.filter { it.matches(Regex("^[0-9]+$")) }.size + var isOK = split4.size == 4 + isOK = isOK && split4.size == split4.filter { it.matches(Regex("^[0-9]+$")) }.size + return isOK } - fun isAddressV6(address: String): Boolean { + private fun isAddressV6(address: String): Boolean { val split6 = address.split(':') - return split6.size == 16 && - split6.size == split6.filter { it.contains(Regex("^[0-9][a-f]+$")) }.size + var isOK = split6.size == 8 + isOK = isOK && split6.size == split6.filter { it.contains(Regex("^[0-9][a-f]+$")) }.size + if (isOK) { + return true + } + + // try with "::" + val split6Double = address.split("::") + if (split6Double.size != 2) { + return false + } + val omitted = 8 - split6Double[0].split(':').size - split6Double[1].split(':').size + if (omitted < 0) { + return false + } + return true } override fun toString(): String { |