September 2017 Update
This commit is contained in:
parent
bba7bfd280
commit
ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions
118
Task/Parse-an-IP-Address/Kotlin/parse-an-ip-address.kotlin
Normal file
118
Task/Parse-an-IP-Address/Kotlin/parse-an-ip-address.kotlin
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
// version 1.1.3
|
||||
|
||||
import java.math.BigInteger
|
||||
|
||||
enum class AddressSpace { IPv4, IPv6, Invalid }
|
||||
|
||||
data class IPAddressComponents(
|
||||
val address: BigInteger,
|
||||
val addressSpace: AddressSpace,
|
||||
val port: Int // -1 denotes 'not specified'
|
||||
)
|
||||
|
||||
val INVALID = IPAddressComponents(BigInteger.ZERO, AddressSpace.Invalid, 0)
|
||||
|
||||
fun ipAddressParse(ipAddress: String): IPAddressComponents {
|
||||
var addressSpace = AddressSpace.IPv4
|
||||
var ipa = ipAddress.toLowerCase()
|
||||
var port = -1
|
||||
var trans = false
|
||||
|
||||
if (ipa.startsWith("::ffff:") && '.' in ipa) {
|
||||
addressSpace = AddressSpace.IPv6
|
||||
trans = true
|
||||
ipa = ipa.drop(7)
|
||||
}
|
||||
else if (ipa.startsWith("[::ffff:") && '.' in ipa) {
|
||||
addressSpace = AddressSpace.IPv6
|
||||
trans = true
|
||||
ipa = ipa.drop(8).replace("]", "")
|
||||
}
|
||||
val octets = ipa.split('.').reversed().toTypedArray()
|
||||
var address = BigInteger.ZERO
|
||||
if (octets.size == 4) {
|
||||
val split = octets[0].split(':')
|
||||
if (split.size == 2) {
|
||||
val temp = split[1].toIntOrNull()
|
||||
if (temp == null || temp !in 0..65535) return INVALID
|
||||
port = temp
|
||||
octets[0] = split[0]
|
||||
}
|
||||
|
||||
for (i in 0..3) {
|
||||
val num = octets[i].toLongOrNull()
|
||||
if (num == null || num !in 0..255) return INVALID
|
||||
val bigNum = BigInteger.valueOf(num)
|
||||
address = address.or(bigNum.shiftLeft(i * 8))
|
||||
}
|
||||
|
||||
if (trans) address += BigInteger("ffff00000000", 16)
|
||||
}
|
||||
else if (octets.size == 1) {
|
||||
addressSpace = AddressSpace.IPv6
|
||||
if (ipa[0] == '[') {
|
||||
ipa = ipa.drop(1)
|
||||
val split = ipa.split("]:")
|
||||
if (split.size != 2) return INVALID
|
||||
val temp = split[1].toIntOrNull()
|
||||
if (temp == null || temp !in 0..65535) return INVALID
|
||||
port = temp
|
||||
ipa = ipa.dropLast(2 + split[1].length)
|
||||
}
|
||||
val hextets = ipa.split(':').reversed().toMutableList()
|
||||
val len = hextets.size
|
||||
|
||||
if (ipa.startsWith("::"))
|
||||
hextets[len - 1] = "0"
|
||||
else if (ipa.endsWith("::"))
|
||||
hextets[0] = "0"
|
||||
|
||||
if (ipa == "::") hextets[1] = "0"
|
||||
if (len > 8 || (len == 8 && hextets.any { it == "" }) || hextets.count { it == "" } > 1)
|
||||
return INVALID
|
||||
if (len < 8) {
|
||||
var insertions = 8 - len
|
||||
for (i in 0..7) {
|
||||
if (hextets[i] == "") {
|
||||
hextets[i] = "0"
|
||||
while (insertions-- > 0) hextets.add(i, "0")
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
for (j in 0..7) {
|
||||
val num = hextets[j].toLongOrNull(16)
|
||||
if (num == null || num !in 0x0..0xFFFF) return INVALID
|
||||
val bigNum = BigInteger.valueOf(num)
|
||||
address = address.or(bigNum.shiftLeft(j * 16))
|
||||
}
|
||||
}
|
||||
else return INVALID
|
||||
|
||||
return IPAddressComponents(address, addressSpace, port)
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val ipas = listOf(
|
||||
"127.0.0.1",
|
||||
"127.0.0.1:80",
|
||||
"::1",
|
||||
"[::1]:80",
|
||||
"2605:2700:0:3::4713:93e3",
|
||||
"[2605:2700:0:3::4713:93e3]:80",
|
||||
"::ffff:192.168.173.22",
|
||||
"[::ffff:192.168.173.22]:80",
|
||||
"1::",
|
||||
"::",
|
||||
"256.0.0.0",
|
||||
"::ffff:127.0.0.0.1"
|
||||
)
|
||||
for (ipa in ipas) {
|
||||
val (address, addressSpace, port) = ipAddressParse(ipa)
|
||||
println("IP address : $ipa")
|
||||
println("Address : ${"%X".format(address)}")
|
||||
println("Address Space : $addressSpace")
|
||||
println("Port : ${if (port == -1) "not specified" else port.toString()}")
|
||||
println()
|
||||
}
|
||||
}
|
||||
27
Task/Parse-an-IP-Address/Python/parse-an-ip-address-1.py
Normal file
27
Task/Parse-an-IP-Address/Python/parse-an-ip-address-1.py
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
from ipaddress import ip_address
|
||||
from urllib.parse import urlparse
|
||||
|
||||
tests = [
|
||||
"127.0.0.1",
|
||||
"127.0.0.1:80",
|
||||
"::1",
|
||||
"[::1]:80",
|
||||
"::192.168.0.1",
|
||||
"2605:2700:0:3::4713:93e3",
|
||||
"[2605:2700:0:3::4713:93e3]:80" ]
|
||||
|
||||
def parse_ip_port(netloc):
|
||||
try:
|
||||
ip = ip_address(netloc)
|
||||
port = None
|
||||
except ValueError:
|
||||
parsed = urlparse('//{}'.format(netloc))
|
||||
ip = ip_address(parsed.hostname)
|
||||
port = parsed.port
|
||||
return ip, port
|
||||
|
||||
for address in tests:
|
||||
ip, port = parse_ip_port(address)
|
||||
hex_ip = {4:'{:08X}', 6:'{:032X}'}[ip.version].format(int(ip))
|
||||
print("{:39s} {:>32s} IPv{} port={}".format(
|
||||
str(ip), hex_ip, ip.version, port ))
|
||||
|
|
@ -1,39 +1,38 @@
|
|||
/*REXX program to parse an IP address into ──► IPv4 or IPv6 format, port*/
|
||||
say center('input IP address' ,30),
|
||||
center('hex IP address' ,32),
|
||||
center('decimal IP address' ,39) 'space port'
|
||||
_='─'
|
||||
say copies(_,30) copies(_,32) copies(_,39) copies(_,5) copies(_,5)
|
||||
call IP_parse 127.0.0.1 /*this IP doesn't need quotes. */
|
||||
/*REXX program parses an IP address into ──► IPv4 or IPv6 format, optional pport.*/
|
||||
_="_"; say center('input IP address' , 30),
|
||||
center('hex IP address' , 32),
|
||||
center('decimal IP address' , 39) 'space port'
|
||||
say copies(_, 30) copies(_, 32) copies(_, 39) copies(_, 5) copies(_, 5)
|
||||
call IP_parse 127.0.0.1 /*this simple IP doesn't need quotes.*/
|
||||
call IP_parse '127.0.0.1:80'
|
||||
call IP_parse '::1'
|
||||
call IP_parse '[::1]:80'
|
||||
call IP_parse '2605:2700:0:3::4713:93e3'
|
||||
call IP_parse '[2605:2700:0:3::4713:93e3]:80'
|
||||
exit /*stick a fork in it, we're done.*/
|
||||
/*──────────────────────────────────IP_parse subroutine─────────────────*/
|
||||
IP_parse: procedure; parse arg a .; hx=; @.=; numeric digits 50
|
||||
dot=pos('.',a)\==0 /*see if there is a dot present. */
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
IP_parse: procedure; parse arg a .; hx=; @.=; numeric digits 50
|
||||
dot=pos(.,a)\==0 /*see if there is a dot present in IP. */
|
||||
|
||||
if dot then do; parse var a @.1 '.' @.2 "." @.3 '.' @.4 ":" port
|
||||
do j=1 for 4; hx=hx || d2x(@.j,2)
|
||||
end /*j*/
|
||||
end /*if dot*/
|
||||
else do; parse var a pureA ']:' port
|
||||
_=space(translate(pureA,,'[]'),0) /*remove brackets*/
|
||||
parse var _ x '::' y
|
||||
do L=1 until x=='' /*get left side.*/
|
||||
parse var x @.L ':' x
|
||||
end /*L*/
|
||||
y=reverse(y)
|
||||
do r=8 by -1 /*get right side.*/
|
||||
parse var y z ':' y; if z=='' then leave
|
||||
@.r=reverse(z)
|
||||
end /*r*/
|
||||
if dot then do; parse var a @.1 '.' @.2 "." @.3 '.' @.4 ":" port
|
||||
do j=1 for 4; hx=hx || d2x(@.j, 2)
|
||||
end /*j*/
|
||||
end
|
||||
else do; parse var a pureA ']:' port
|
||||
_=space( translate( pureA, , '[]'), 0) /*remove brackets.*/
|
||||
parse var _ x '::' y
|
||||
do L=1 until x=='' /*get left side. */
|
||||
parse var x @.L ':' x
|
||||
end /*L*/
|
||||
y=reverse(y)
|
||||
do r=8 by -1 /*get right side. */
|
||||
parse var y z ':' y; if z=='' then leave
|
||||
@.r=reverse(z)
|
||||
end /*r*/
|
||||
|
||||
do k=1 for 8; hx=hx || right(word(@.k 0, 1), 4, 0)
|
||||
end /*k*/
|
||||
end /*else dot*/
|
||||
do k=1 for 8; hx=hx || right( word(@.k 0, 1), 4, 0)
|
||||
end /*k*/
|
||||
end
|
||||
|
||||
say left(a,30) right(hx,32) right(x2d(hx),39) ' IPv'||(6-2*dot) right(port,5)
|
||||
return
|
||||
say left(a,30) right(hx,32) right(x2d(hx),39) ' IPv' || (6-2*dot) right(port,5)
|
||||
return
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue