【问题标题】:Bash shell Decimal to Binary base 2 conversionBash shell 十进制到二进制基数 2 的转换
【发布时间】:2012-05-03 22:40:24
【问题描述】:

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

$ip1 $ip2 $ip3 $ip4

有没有一种简单的方法可以做到这一点,而无需查看每个单独的数字?

我宁愿不用写很多代码。

【问题讨论】:

    标签: bash shell binary decimal


    【解决方案1】:

    您可以将bc 用作:

    echo "obase=2;$ip1" | bc
    

    See it

    【讨论】:

    • 目前我有 echo "obase=2;$ip1" | bc echo "obase=2;$ip2" | bc echo "obase=2;$ip3" | bc echo "obase=2;$ip4" | bc 和 echo 每行输出一个换行符。有没有办法让它输出提示到尾
    • @DanielDC:你可以这样做:echo "obase=2;10;20;30" | bc | tr -d '\n'
    • @DanielDC:在末尾添加| tr -d '\n'
    • 很好的解决方案;一个更紧凑(性能稍好)的版本是:bc <<<"obase=2;$ip1"
    • 如果您正在寻找反转过程,即二进制到十进制,这里是echo $((2#$@)),其中$@ 是您的二进制数。
    【解决方案2】:

    使用 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


    这将使用 bash 的 brace expansion 创建一个带有 00000000 00000001 00000010 ... 11111101 11111110 11111111 的数组。数组 D2B 中的位置代表它的十进制值。

    另见:Understanding code ({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})

    【讨论】:

    • 非常好的纯 bash 解决方案!要将此范围概括为 0 到 2^n-1,请使用 eval D2B='('$(for ((i=0; i<$n; i++)); do printf '%s' "{0..1}"; done)')'(在设置 n 之后)。唯一的缺点是这种方法占用 O(2^n) 空间(超多项式!)。这很快就会变得笨拙。
    • 令人难以置信的紧密解决方案!你能解释一下会发生什么吗? {0..1} 是什么意思?
    • echo $D2B 的输出是00000000,这让我很困惑,因为它看起来不像一个数组,而是一个简单的字符串。谢谢你开导我!
    • @domih:这里的D2B 是一个数组。我不推荐使用$D2B,因为它是用来显示字符串的。要访问数组的第一个元素,请使用 ${D2B[0]}
    【解决方案3】:

    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
    

    【讨论】:

      【解决方案4】:

      将整数转换为具有另一个基数的另一种表示形式的通用方法(但基数

      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
      

      【讨论】:

        【解决方案5】:

        在 bash 中定义为函数:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2012-06-22
            • 2022-09-29
            • 2016-09-01
            • 2011-01-10
            • 2023-04-11
            • 2019-05-10
            • 2016-02-09
            • 2016-08-26
            相关资源
            最近更新 更多