Question

Y a-t-il une commande pour convertir l'adresse IP sous forme binaire?

Par exemple: 10.110.11.116

Sortie: 00001010.01101110.0000111.01110100

Était-ce utile?

La solution

Eh bien, voici une façon (très compliquée) de le faire:

pax> export ip=10.110.11.116

pax> for i in $(echo ${ip} | tr '.' ' '); do echo "obase=2 ; $i" | bc; done
     | awk '{printf ".%08d", $1}' | cut -c2-
00001010.01101110.00001011.01110100

La echo/tr La déclaration vous donne une liste séparée par l'espace des octets et le for traite ceux-ci à la fois.

Pour chacun, vous le traversez bc avec la base de sortie réglée sur 2 (binaire). Ces quatre lignes de nombres binaires de longueur variable passent puis passent par awk Pour les forcer à une taille de 8, remettez-les sur une seule ligne et précédemment chacun avec un . et la finale cut supprime juste le premier ..

Je suis presque certain qu'il existe de meilleures façons de le faire bien sûr, mais cela montre ce que vous pouvez faire avec un peu d'ingéniosité et trop de décennies passées à jouer avec Unix :-)

Autres conseils

Voici une façon de le faire - pas de zéros de premier plan sur les chiffres binaires: cependant:

IP=192.168.4.254
echo $IP | tr '.' '\n' | while read octet
do
        echo "2 o $octet p" | dc
done | tr '\n' '.'

Ou en un seul appel à DC:

IP=192.168.4.254
echo $IP | tr '.' ' ' | while read octet1 octet2 octet3 octet4
do
        echo "2 o $octet1 p $octet2 p $octet3 p $octet4 p" | dc | tr '\n' '.'
done

Voici une façon qui fonctionnera dans Bash sans aucun service public externe:

tobin ()
{
    local val bits b c d;
    val=$1;
    bits="";
    (( val < 2 )) && bits=$val;
    b="";
    while (( val > 1 )); do
        bits=$b$bits;
        (( b = val % 2 ));
        (( c = ( val / 2 ) * ( val % 2 ) ));
        (( val = val / 2 ));
        (( d = val ));
    done;
    echo "$d$c$bits"
}

byte () { printf "%08d" $1; }

unset dot binary
saveIFS=$IFS
IFS=.
ip=($1)
IFS=saveIFS
for octet in ${ip[@]}
do
    binary=$binary$dot$(byte $(tobin $octet))
    dot=.
done
echo $binary

Pour un obus Bourne conforme à POSIX:

tobin () {
    local val bits b c d
    val=$1
    bits=""
    if [ $val -lt 2 ]
    then
        bits=$val
    fi
    b=""
    while [ $val -gt 1 ]
    do
        bits=$b$bits
        b=$(($val%2))
        c=$((($val/2)*($val%2)))
        val=$(($val/2))
        d=$val
    done
    echo "$d$c$bits"
}

byte () { printf "%08d" $1; }    # printf may be an external utility in some shells

unset dot binary
saveIFS=$IFS
IFS=.
set -- $a
IFS=$saveIFS

for octet
do
    binary=$binary$dot$(byte $(tobin $octet))
    dot=.
done
echo $binary
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top