UNIX:如何将IP地址转换为二进制代码

问题描述:

是否有任何命令将IP地址转换为二进制形式?UNIX:如何将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