Unix: как преобразовать IP-адрес в двоичный код

StackOverflow https://stackoverflow.com/questions/4042601

  •  27-09-2019
  •  | 
  •  

Вопрос

Есть ли какая-либо команда для преобразования 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top