Comment convertir une valeur hexadécimale en adresse IP «standard»?

1

Comment convertir manuellement une valeur hexadécimale en adresse IP sans convertisseur en ligne?

Par exemple, qu'est-ce que 80D00297 en notation par points IP normale?

Fredo Martinez
la source
3
windows cmd> ping 0x80D00297=>Pinging 128.208.2.151 with 32 bytes of data:
guest-vm
Je pense que vous aimerez peut - être être source de confusion d' une adresse MAC et l' adresse IP. Où voyez-vous une adresse IP représentée par une valeur hexadécimale?
djsmiley2k
1
@ djsmiley2k Ce n'est pas une adresse MAC. Les adresses MAC contiennent 6 groupes de deux chiffres hexadécimaux et non pas 4.
DavidPostill

Réponses:

3

Utilisation de sed et bash

$ printf '%d.%d.%d.%d\n' $(echo 80D00297 | sed 's/../0x& /g')
128.208.2.151

Comment ça fonctionne:

  • sed est utilisé pour reformater le nombre:

    $ echo 80D00297 | sed 's/../0x& /g'
    0x80 0xD0 0x02 0x97 
    
  • Le %dformat de printfest utilisé pour convertir les nombres hexadécimaux en nombres décimaux.

Utiliser GNU awk

$ echo 80D00297 | gawk --non-decimal-data '{for (i=1;i<=NF;i++) printf "%d%s","0x"$i,(i==NF?"\n":".")}' FPAT='..' 
128.208.2.151

Cela permet FPAT='..'de diviser l’entrée en deux champs de caractères. Nous parcourons ensuite chaque champ, plaçons un 0xdevant, et le transmettons printfavec le %dformat de sorte que le nombre hexadécimal soit converti en décimal.

Une partie apparemment complexe de ce qui précède est la déclaration ternaire (i==NF?"\n":"."). Cette déclaration renvoie un caractère de nouvelle ligne si nous sommes sur le dernier champ, i==NF. Pour les autres valeurs de i, renvoie une période .,. De cette façon, les nombres sont séparés par un point mais le dernier nombre est suivi d'un caractère de nouvelle ligne.

John1024
la source
2
Probablement dû à quelque chose lié à endianness, mais cela a inversé l'ordre pour moi, donc j'ai dû le modifier en sed 's/../0x&\n/g' | tac.
Muru
2

En supposant que vous vouliez dire le convertir en chaîne ou en représentation en pointillé

La première chose que vous devez savoir est de savoir si l'adresse est dans l'ordre des octets du réseau ou dans l'ordre des octets de l'hôte. L'ordre des octets du réseau est big-endian, alors que les ordinateurs basés sur intel sont little-endian. Vous pouvez convertir l'un en l'autre en utilisant une fonction appelée ntohl, qui prend essentiellement chaque octet (2 caractères hexadécimaux) de l'adresse et les inverse, de sorte que 80d00297 deviendrait 9702d080.

Ensuite, prenez chaque octet et convertissez-le en décimal. Vous pouvez utiliser une calculatrice pour cela.

80 => 128
d0 => 208
02 => 2
97 => 151

ainsi, si cette adresse est dans l'ordre des octets de l'hôte, l'adresse est 128.208.2.151

Adrien
la source
Bonne réponse! La question a souligné "manuellement". Je pense qu’un calcul pas à pas comme celui-ci est nécessaire
papigee