Conversion mutuelle de l'adresse IP et de l'entier

Adresse github du projet: bitcarmanlee easy-algorithm-interview-and-practice envoie
souvent des messages privés aux étudiants ou laissent des messages pour poser des questions connexes, numéro V bitcarmanlee. Les camarades de classe de star sur github, dans la limite de mes capacités et de mon temps, je ferai de mon mieux pour vous aider à répondre aux questions connexes et à progresser ensemble.

1. Pourquoi faut-il convertir ip en entier

En ce qui concerne l'adresse IP d'ipv4, si le stockage de chaînes est utilisé, l'espace occupé est relativement important. Par exemple, la chaîne 0.1.2.3 nécessite 7 octets. Pour la chaîne 255.255.255.255, 15 octets sont requis. Dans l'ensemble, il faut 7 à 15 octets pour stocker une adresse IP.

Alors, y a-t-il une meilleure façon de stocker en utilisation réelle, afin d'économiser de l'espace de stockage? La réponse est oui.
ipv4 est essentiellement une chaîne binaire de 32 bits. Un entier entier fait exactement 4 octets et 32 ​​bits, donc un entier de type int peut simplement représenter une adresse ipv4. Par conséquent, nous utilisons un nombre de type int de 4 octets pour représenter une adresse IP, ce qui peut atteindre l'objectif d'économiser de l'espace.

2. adresse IP en entier

Voyons comment implémenter l'adresse IP en entier.

public class Ipaddress {

    public static boolean isIpv4Address(String ip) {
        if (StringUtils.isEmpty(ip)) {
            return false;
        }

        String[] lines = ip.split("\\.");
        if (lines.length != 4) return false;

        for(String pattern : lines) {
            try {
                int number = Integer.parseInt(pattern);
                if (number >= 0 && number <= 255) continue;
                else return false;
            } catch (NumberFormatException e) {
                return false;
            }
        }
        return true;
    }


    public static int ip2int(String ip) {
        if (!isIpv4Address(ip)) {
            throw new RuntimeException("invalid ip address");
        }

        int result = 0;
        String[] lines = ip.split("\\.");
        for(String pattern: lines) {
            int number = Integer.parseInt(pattern);
            result = number | (result << 8);
        }

        return result;
    }
    
    public static void main(String[] args) {
        String ip = "125.213.100.123";
        int result = ip2int(ip);
        System.out.println(result);
        System.out.println(125*256*256*256+213*256*256+100*256+123);
    }
}

La sortie du code est:

2111136891
2111136891

L'idée du code ci-dessus:
1. Jugez d'abord de la légitimité de l'adresse IP d'entrée.
2. Séparez ip par et divisez-le en 4 sections.
3. Déplacez le premier segment vers la gauche de 24 bits, le deuxième segment vers la gauche de 16 bits, le troisième segment vers la gauche de 8 bits et le quatrième segment reste inchangé. Ajoutez les résultats pour obtenir le résultat final. La logique de mise en œuvre spécifique est
result = number | (result << 8)cette ligne.
4. S'il s'agit de la méthode la plus violente, 125*256*256*256+213*256*256+100*256+123cette partie de la méthode principale réalise la logique mentionnée à l'article 3, et le résultat final obtenu par les deux est le même.

3. Entier vers adresse IP

Inversement, si nous avons un entier et que nous voulons le convertir en une adresse IP, c'est en fait le processus inverse de ce qui précède.

import org.apache.commons.lang3.StringUtils;

public class Ipaddress {

    public static String int2ip(int num) {
        return ((num >> 24) & 0xff) + "." +
                ((num >> 16) & 0xff) + "." +
                ((num >> 8) & 0xff) + "." +
                (num & 0xff);
    }

    public static void main(String[] args) {
        int num = 2111136891;
        String ip = int2ip(num);
        System.out.println(ip);
    }
}

La logique spécifique est la suivante:
le premier segment de l'adresse IP est décalé num vers la droite de 24 bits, puis les 8 bits inférieurs sont pris
. Le deuxième segment est décalé num vers la droite de 16 bits, puis les 8 bits inférieurs sont pris
. Le troisième segment de l'adresse IP est décalée num à droite de 8. Prenez les 8 bits inférieurs après le bit
, le quatrième segment de l'adresse IP est num et prenez les 8 bits inférieurs

Je suppose que tu aimes

Origine blog.csdn.net/bitcarmanlee/article/details/113662877
conseillé
Classement