Algoritmo - Verifique a legitimidade do endereço IP

DescriçãoEscreva uma função para verificar se a string de entrada é um endereço IPv4 ou IPv6 válido

Os endereços IPv4 são representados por números decimais e pontos. Cada endereço contém 4 números decimais, variando de 0 a 255, separados por ("."). Por exemplo, 172.16.254.1;
ao mesmo tempo, o número no endereço IPv4 não começará com 0. Por exemplo, o endereço 172.16.254.01 é ilegal.

Os endereços IPv6 são representados por 8 grupos de números hexadecimais, cada grupo representando 16 bits. Esses grupos de números são separados por (":"). Por exemplo,
2001:0db8:85a3:0000:0000:8a2e:0370:7334 é um endereço válido. Além disso, podemos adicionar alguns números começando com 0 e as letras podem ser maiúsculas ou minúsculas. Portanto, 2001:db8:85a3:0:0:8A2E:0370:7334 também é um endereço IPv6 válido (ou seja, ignorando o 0 inicial e ignorando maiúsculas e minúsculas). Porém, não podemos usar um grupo vazio porque o valor de um determinado grupo é 0, para que ocorra a situação ( : : ). Por exemplo, 2001:0db8:85a3::8A2E:0370:7334 é um endereço IPv6 inválido. Ao mesmo tempo, em endereços IPv6, 0s extras não são permitidos. Por exemplo, 02001:0db8:85a3:0000:0000:8a2e:0370:7334 é inválido.

Nota: Você pode assumir que não há espaços ou outros caracteres especiais na string fornecida.

Processe sequências de endereços IP delimitando as sequências e verificando a legalidade uma por uma.

rápido:

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
}

Acho que você gosta

Origin blog.csdn.net/weixin_44758107/article/details/127753882
Recomendado
Clasificación