40

我正在寻找一种在 Bash 中将十进制数转换为二进制数的简单方法。我有需要转换的变量:

$ip1 $ip2 $ip3 $ip4

有没有一种简单的方法可以在不查看每个数字的情况下做到这一点?

我宁愿不必写很多代码。

4

6 回答 6

78

您可以bc用作:

echo "obase=2;$ip1" | bc

看见

于 2012-04-23T10:09:15.760 回答
52

使用 bash 内置命令(范围 0 到 255)将十进制转换为二进制:

D2B=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})

echo ${D2B[7]}

00000111

echo ${D2B[85]}

01010101

echo ${D2B[127]}

01111111


要删除前导零,例如从${D2B[7]}

echo $((10#${D2B[7]}))

111


00000000 00000001 00000010 ... 11111101 11111110 11111111这将创建一个带有 bash大括号扩展的数组。数组 D2B 中的位置表示其十进制值。

另请参阅:了解代码 ({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0 ..1})

于 2014-09-19T22:58:38.757 回答
5

Bash 中的十进制到二进制转换:

我正在使用 Ubuntu 14.04 来执行此操作。

将小数 1 到 5 转换为二进制。

el@apollo:~$ bc <<< "obase=2;1"
1
el@apollo:~$ bc <<< "obase=2;2"
10
el@apollo:~$ bc <<< "obase=2;3"
11
el@apollo:~$ bc <<< "obase=2;4"
100
el@apollo:~$ bc <<< "obase=2;5"
101

奖金示例:

el@apollo:~$ bc <<< "obase=2;1024"
10000000000

el@apollo:~$ bc <<< "obase=2;2^128"
100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
于 2014-06-20T20:38:14.483 回答
3

将整数转换为具有另一个基数的另一种表示形式的通用方法(但基数<=10,因为仅使用数字 0..9 表示):

function convertIntvalToBase () # (Val Base)
{
   val=$1
   base=$2
   result=""
   while [ $val -ne 0 ] ; do
        result=$(( $val % $base ))$result #residual is next digit
        val=$(( $val / $base ))
   done
   echo -n $result
}

例如

convertIntvalToBase $ip1 2     # converts $ip1 into binary representation
于 2014-11-04T16:05:20.793 回答
2

定义为 bash 中的函数:

# to Binary:
toBinary(){
    local n bit
    for (( n=$1 ; n>0 ; n >>= 1 )); do  bit="$(( n&1 ))$bit"; done
    printf "%s\n" "$bit"
}
于 2021-09-19T23:13:03.163 回答
0

仅使用 Bash 将十进制转换为二进制

任何整数都可以使用它转换为二进制::

touch dec2bin.bash && chmod +x "$_" && vim "$_"

然后,复制粘贴以下内容:

#!/bin/bash
num=$1;
dec2bin()
{
    op=2; ## Since we're converting to binary
    quo=$(( $num/ $op)); ## quotient
    rem=$(( $num% $op)); ## remainder
    array=(); ## array for putting remainder inside array
    array+=("$rem"); ## array expansion
        until [[ $quo -eq 0 ]]; do
            num=$quo; ## looping to get all remainder, untill the remainder is 0
            quo=$(( $num / $op));
            rem=$(( $num % $op));
            array+="$rem"; ## array expansion
        done
    binary=$(echo "${array[@]}" | rev); ## reversing array
    printf "$binary\n"; ## print array
}
main()
{
[[ -n ${num//[0-9]/} ]] &&
    { printf "$num is not an integer bruv!\n"; return 1;
    } || { dec2bin $num; }
}
main;

例如:

./dec2bin.bash $var
110100100

必须加整数!!

./dec2bin.bash 420.py
420.py is not an integer bruv!

另外,使用 python 的另一种方式:慢得多

python -c "print(bin(420))"
0b110100100

仅使用 Bash 将十六进制转换为二进制

同样,十六进制转二进制,如下仅使用 bash:

#!/usr/local/bin/bash ## For Darwin :( higher bash :)
#!/bin/bash ## Linux :)
hex=$1;
hex2bin()
{
    op=2; num=$((16#$hex));
    quo=$(( $num/ $op));
    rem=$(( $num% $op));
    array=();
    array+=("$rem");
        until [[ $quo -eq 0 ]]; do
            num=$quo;
            quo=$(( $num / $op));
            rem=$(( $num % $op));
            array+="$rem";
        done
    binary=$(echo "${array[@]}" | rev);
    printf "Binary of $1 is: $binary\n";
}
main()
{
[[ -n ${hex//[0-9,A-F,a-f]/} ]] &&
    { printf "$hex is not a hexa decimal number bruv!\n"; return 1;
    } || { hex2bin $hex; }
}
main;

例如:

./hex2bin.bash 1aF
Binary of 1aF is: 110101111

必须通过十六进制:

./hex2bin.bash XyZ
XyZ is not a hexa decimal number bruv!
于 2019-04-30T11:37:51.150 回答