Bash shell十进制到二进制的转换

vhmi4jdf  于 2023-01-05  发布在  Shell
关注(0)|答案(9)|浏览(361)

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

$ip1 $ip2 $ip3 $ip4

有没有一个简单的方法可以做到这一点,而不必查看每一个单独的数字?
我宁愿不必写很多代码。

6ljaweal

6ljaweal1#

可以将bc用作:

echo "obase=2;$ip1" | bc

See it

4szc88ey

4szc88ey2#

使用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中的位置表示它的十进制值。
另请参阅:Understanding code ({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})

deyfvvtc

deyfvvtc3#

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
lztngnrs

lztngnrs4#

将整数转换为具有另一个基数的另一种表示法的一般方法(但基数〈=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
xqnpmsa8

xqnpmsa85#

在bash中定义为函数:

# to Binary:
toBinary(){
    local n bit
    for (( n=$1 ; n>0 ; n >>= 1 )); do  bit="$(( n&1 ))$bit"; done
    printf "%s\n" "$bit"
}
wj8zmpe1

wj8zmpe16#

我喜欢用dc来做这个,它非常简洁:

$ n=50; dc -e "$n 2op"
110010

此处的命令如下所示:
1.通过shell扩展将数字n压入堆栈。
1.将2压入堆栈,然后使用o弹出堆栈,并使用2作为o输出基数。

  1. pprint堆栈顶部(它就是n),使用步骤2中设置的输出基数(因此以二进制打印)。
    如果要填充:
$ n=50; pad_size=16; printf "%0${pad_size}d\n" $(dc -e "$n 2op")
0000000000110010
wmtdaxz3

wmtdaxz37#

为了让@codadicate的回答更漂亮一些,可以使用以下代码在输出前加上0b作为"binary"的前缀:

printf "0b%s\n" "$(echo "obase=2; $((num1 + num2))" | bc)"

示例:

num1=2#1111  # binary  1111 (decimal 15)
num2=2#11111 # binary 11111 (decimal 31)
printf "0b%s\n" "$(echo "obase=2; $((num1 + num2))" | bc)"

输出:

0b101110

这是十进制46。
有关bash中输入base-2格式的详细信息,例如上面的2#1111,请参见我的答案的最后部分:How to use all bash operators, and arithmetic expansion, in bash.
要使输出中至少包含8位数字,请使用:

printf "0b%08d\n" $(echo "obase=2; $((num1 + num2))" | bc)

资料来源:David Rankin, in an answer to my question here

ax6ht2ek

ax6ht2ek8#

    • 仅使用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!
vaqhlq81

vaqhlq819#

toBin ()
{
    printf "%08d\n" $(dc -e "$1 2op")
}

$ toBin 37
00100101

相关问题