説明入力文字列が有効な IPv4 または IPv6 アドレスであることを確認する関数を作成します。
IPv4 アドレスは 10 進数とドットで表され、各アドレスには 0 ~ 255 の 4 つの 10 進数が (「.」) で区切られて含まれます。たとえば、172.16.254.1;
同時に、IPv4 アドレスの数字は 0 で始まりません。たとえば、アドレス 172.16.254.01 は不正です。
IPv6 アドレスは 8 つの 16 進数グループで表され、各グループは 16 ビットを表します。これらの数値グループは (「:」) で区切られます。たとえば、
2001:0db8:85a3:0000:0000:8a2e:0370:7334 は有効なアドレスです。さらに、0 から始まる数字を追加することもでき、文字は大文字でも小文字でもかまいません。したがって、2001:db8:85a3:0:0:8A2E:0370:7334 も有効な IPv6 アドレスです (つまり、先頭の 0 と大文字小文字は無視されます)。ただし、あるグループの値が 0 であるため、空のグループを使用することができず、( : : ) の状況が発生します。たとえば、2001:0db8:85a3::8A2E:0370:7334 は無効な IPv6 アドレスです。同時に、IPv6 アドレスでは、余分な 0 は許可されません。たとえば、02001:0db8:85a3:0000:0000:8a2e:0370:7334 は無効です。
注: 指定された文字列にはスペースやその他の特殊文字が含まれていないと想定できます。
IP アドレス文字列を文字列で区切って 1 つずつ正当性をチェックして処理します。
迅速:
func solveIPAdress ( _ IP: String) -> String {
if IP.count <= 0 {
return "Neither" }
if check_IPv4_usingSplit(IP) {
return "IPv4"
}else if check_IPv6_usingSplit(IP) {
return "IPv6"
}else{
return "Neither"
}
}
func check_IPv4_usingSplit ( _ IP: String) -> Bool {
let adress = IP.components(separatedBy: ".")
if adress.count != 4 {
return false //ip地址不满足数量四
}
for i in 0..<adress.count {
if adress[i].count <= 0 || adress[i].count > 3 {
return false //ip地址位数 不合法
}
let strAray = Array(adress[i])
let firstNum = strAray[0] //ip地址首位数字
if firstNum == "0" && adress[i].count > 1 {
return false //存在前导0
}
for str in strAray {
if ((Character(String(str)).asciiValue! >= Character("a").asciiValue! &&
Character(String(str)).asciiValue! <= Character("z").asciiValue!) ||
(Character(String(str)).asciiValue! >= Character("A").asciiValue! &&
Character(String(str)).asciiValue! <= Character("Z").asciiValue!)) {
return false //ipv4地址中没有 a-z A-Z
}
}
var num = 0
for str in strAray {
num = num * 10 + Int(Character(String(str)).asciiValue! - Character("0").asciiValue!)
}
if num < 0 || num > 255 {
return false //ip地址大小不合法
}
}
return true
}
func check_IPv6_usingSplit ( _ IP: String) -> Bool {
let adress = IP.components(separatedBy: ":")
if adress.count != 8 {
return false //ipv6位数不满足8位
}
for i in 0..<adress.count {
if adress[i].count <= 0 || adress[i].count > 4 {
return false //ipv6地址位 1-4
}
let strArray = Array(adress[i])
for str in strArray {
if !((Character(String(str)).asciiValue! >= Character("a").asciiValue! &&
Character(String(str)).asciiValue! <= Character("f").asciiValue!) ||
(Character(String(str)).asciiValue! >= Character("A").asciiValue! &&
Character(String(str)).asciiValue! <= Character("F").asciiValue!) ||
(Character(String(str)).asciiValue! >= Character("0").asciiValue! &&
Character(String(str)).asciiValue! <= Character("9").asciiValue!)) {
return false //ipv4地址只有 0-9 a-z A-Z
}
}
}
return true
}