1

是否有任何命令可以将 ip 地址转换为二进制形式?

例如:10.110.11.116

输出:00001010.01101110.00001011.01110100

4

3 回答 3

3

好吧,这是一种(非常复杂的)方法:

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 的大小,将它们放回一行,并在每行前面加上 a .,最后cut删除第一个.

我几乎可以肯定当然有更好的方法来做到这一点,但这表明你可以用一点独创性和在 UNIX 上花费数十年时间来做些什么 :-)

于 2010-10-28T12:13:42.220 回答
0

这是一种方法 - 但是二进制数字上没有前导零:

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
于 2010-10-28T12:01:53.827 回答
0

这是一种无需任何外部实用程序即可在 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
于 2010-10-28T20:29:58.623 回答