Ответ 1
Вы можете использовать bc
как:
echo "obase=2;$ip1" | bc
Я ищу простой способ в Bash конвертировать десятичное число в двоичное число. У меня есть переменные, которые необходимо преобразовать:
$ip1 $ip2 $ip3 $ip4
Есть ли простой способ сделать это, не глядя на каждый отдельный номер?
Я бы предпочел не писать много кода.
Вы можете использовать bc
как:
echo "obase=2;$ip1" | bc
Преобразуйте десятичные числа в двоичные с помощью встроенных команд 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})
Общий метод преобразования целочисленного числа в другое представление с другой базой (но base <= 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
Десятичное значение для двоичного преобразования в Bash:
Я использую Ubuntu 14.04 для этого.
Преобразуйте десятичные знаки с 1 по 5 в двоичные.
[email protected]:~$ bc <<< "obase=2;1"
1
[email protected]:~$ bc <<< "obase=2;2"
10
[email protected]:~$ bc <<< "obase=2;3"
11
[email protected]:~$ bc <<< "obase=2;4"
100
[email protected]:~$ bc <<< "obase=2;5"
101
Бонусный пример:
[email protected]:~$ bc <<< "obase=2;1024"
10000000000
[email protected]:~$ bc <<< "obase=2;2^128"
100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Десятичный в двоичный с использованием только 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!