Y at-il une commande pour convertir l'adresse IP en format binaire?UNIX: Comment convertir l'adresse IP en code binaire
Par exemple: 10.110.11.116
sortie: 00001010.01101110.00001011.01110100
Y at-il une commande pour convertir l'adresse IP en format binaire?UNIX: Comment convertir l'adresse IP en code binaire
Par exemple: 10.110.11.116
sortie: 00001010.01101110.00001011.01110100
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 :-)
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
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