Unix: как преобразовать IP-адрес в двоичный код
Вопрос
Есть ли какая-либо команда для преобразования IP-адреса в двоичную форму?
Например: 10.110.11.116.
Вывод: 00001010.01101110.00001011.01110100.
Решение
Ну вот один (очень запутанный) способ сделать это:
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
То echo/tr
Заявление дает вам список разделяемого в космос список октетов и for
обрабатывает эти один за раз.
Для каждого, вы передаете это через bc
С выходной базой установлен на 2 (двоичный). Эти четыре линии бинарных чисел переменной длины затем проходят через awk
заставить их размером 8, положить их обратно на одну строку и предшествовать каждому с помощью .
и финал cut
просто удаляет первый .
.
Я почти уверен, что есть лучшие способы сделать это, конечно, но это показывает, что вы можете сделать с небольшим количеством изобретательности и слишком много десятилетий, потраченных с Unix :-)
Другие советы
Вот один из способов сделать это - без ведущих нулей на двоичных цифрах, однако:
IP=192.168.4.254
echo $IP | tr '.' '\n' | while read octet
do
echo "2 o $octet p" | dc
done | tr '\n' '.'
Или как один вызов 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
Вот способ, который будет работать в Bash без каких-либо внешних утилит:
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
Для соответствия POSIX Bourne Shell:
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