У меня есть контекст, где мне нужно преобразовать двоичные в шестнадцатеричные и десятичные и наоборот в сценарии оболочки. Может кто-нибудь предложить мне инструмент для этого?
shell-script
binary
arithmetic
Банги
источник
источник
Ответы:
Это довольно просто сделать преобразование из двоичного в чистом Bash (
echo
иprintf
являются встроенными):Двоичный в десятичный
Двоичный в шестнадцатеричный
Возвращение к двоичному виду с использованием одного только bash несколько сложнее, поэтому я предлагаю вам посмотреть другие ответы для решения этой проблемы.
источник
printf '%x\n' 10
, например.printf %d
для bin2dec?$(( ... ))
уже дает десятичный результат,echo
достаточно.printf '%s\n' foo
вместоecho
множества причин (в основном, переносимость), по той же причине, я здесь не использую.echo
встроенную функцию ). Виноват!Предполагая, что под двоичными данными вы подразумеваете двоичные данные как в данных с любым возможным байтовым значением, включая 0, а не числа с базовыми 2:
Для преобразования из двоичного файла,
od
(стандарт),xxd
(поставляется сvim
) илиperl
«sunpack
приходит на ум.Теперь, чтобы преобразовать обратно в двоичный файл
awk
(стандартный)xxd -r
илиperl
spack
:Из десятичной дроби от
od -tu1
илиperl
выше:Из гекса
perl
илиxxd -p
выше:источник
Вы можете использовать бв для этого, манипулируя
ibase
иobase
параметры:Хитрость в том, что вам нужно четко указывать основы. Так что если ваш ibase равен 2, то если вы установите свой obase на 10, он ничего не сделает, так как 10 в двоичном виде - 2. Следовательно, вам нужно использовать шестнадцатеричное представление.
Таким образом, двоичное в десятичное будет (смотреть, что obase это A)
Двоичные в десятичные:
Бинарный в гекс:
Если
obase
сначала изменить «выходную базу» , это должно быть проще:источник
echo 'ibase=2;obase=F;1111
который должен быть равен десятичной 15, т.е. F в гекс. Получается как 10, что в базе 15 (цифры 0-E). Кроме того , легче , если вы указать obase первой , например:echo 'obase=16;ibase=2;1111'|bc
. Нет путаницы.ibase
, вы должны предоставить вход в эту базу, даже дляobase
. Так в вашем примере будетecho 'ibase=2;obase=10000;11110001011010'|bc
. Лучше прислушайтесь к совету Златовласки и измените порядок - сначала установитеobase
, а затемibase
.Если вы имеете в виду преобразование чисел из базы-2 в 10 или 16 и обратно,
bc
это стандартный инструмент для этого, как уже упоминалось в psarossy .В некоторых оболочках
zsh
есть встроенная поддержка преобразования базы как часть их арифметических операторов расширения:и так далее.
Оба,
ksh93
аzsh
также поддержка:Но обратите внимание, что при расширении
$binary
будет иметь префикс2#
или16#
(который можно удалить с помощью${binary#*#}
.ksh93
также поддерживает:преобразовать в двоичный файл
источник
Для двоичного и шестнадцатеричного использования: инструмент xxd в linux, а для двоичного в десятичное - инструмент qalculate.
Для получения справки о типе xxd
xxd --help
илиman xxd
в Linux.источник
Вы можете использовать PHP:
Или Perl:
Или POSIX Awk svnpenn / stdlib :
источник
Как упомянуто в предыдущем ответе, вы можете сделать Binary to Decimal и Hexa Decimal следующим образом в Bash, используя echo и printf. Я просто добавляю сюда, как конвертировать из десятичного числа и шестнадцатеричного в двоичный, используя чистый Bash.
Двоичные в десятичные с использованием эхо
Двоичные в гекса-десятичные с использованием printf
Целочисленное десятичное в двоичное преобразование с использованием только Bash
Используя только Bash, если вы хотите преобразовать десятичное число в двоичное, вы можете сделать это следующим образом:
А затем скопируйте и вставьте следующее:
А затем попробуйте оттуда, где вы сохранили:
Необходимо добавить целое число !!
Шестнадцатеричное преобразование в двоичное с использованием только Bash
Аналогично, от шестнадцатеричного до двоичного, как показано ниже, используя только bash:
Например:
Шестнадцатеричное должно быть передано:
источник