blob: 5e3cb0cf03e143eb7f06ef0a67fdbc25f415abac (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
/**
* An IP address (v4 or v6).
*/
class IPAddress {
private var address: Array<Byte>
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(':')
val isV4 = split4.size == 4 &&
split4.size == split4.filter { it.matches(Regex("^[0-9]$")) }.size
val isV6 = split6.size == 16 &&
split6.size == split6.filter { it.contains(Regex("^[0-9][a-f]$")) }.size
if (isV4) {
this.is4 = true
} else if (isV6) {
this.is4 = false
} else {
throw NumberFormatException()
}
var bytes: List<Byte> = if (this.is4) {
split4.map { it.toByte(10) }
} else {
split6.map { it.toByte(16) }
}
this.address = bytes.toTypedArray()
}
override fun toString(): String {
val str: String
if (this.is4) {
str = this.address.joinToString(separator = ".") { it.toString() }
} else {
str = this.address.joinToString(separator = ":") { it.toString() }
}
return str
}
}
|