summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdoardo La Greca2025-06-20 02:52:01 +0200
committerEdoardo La Greca2025-06-20 02:52:01 +0200
commit50f323a54ed605d220e68bc07341698f2a0b0aaf (patch)
tree4e9b08139f9cb131c331a6b8c2e405cd60568a65
parentbbb3a475b0c7b7d2b5423098567f094b0e263a6e (diff)
improve IPAddress constructor and make isAddressV4 and isAddressV6 private
-rw-r--r--src/main/kotlin/IPAddress.kt45
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 {