2010-10-28 12 views

Répondre

3

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 déclaration echo/tr vous donne une liste séparée par des espaces des octets et les processus for ceux-ci un à la fois.

Pour chacun d'entre eux, vous le passez à bc avec la base de sortie définie sur 2 (binaire). Ces quatre lignes de nombres binaires de longueur variable passent ensuite par awk pour les forcer à une taille de 8, les remettent sur une seule ligne, et précèdent chacune avec . et la dernière cut supprime simplement la première ..

Je suis presque certain qu'il ya 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 :-)

0

Voici une façon de le faire - pas zéros 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 comme 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 
0

Voici une manière qui travailler Bash sans services externes:

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 une Bourne shell conforme aux spécifications 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