Может ли кто-нибудь помочь мне преобразовать шестнадцатеричное число в десятичное в сценарии оболочки?
Например, я хочу преобразовать шестнадцатеричное число bfca3000
в десятичное с помощью сценария оболочки. Мне в основном нужна разница двух шестнадцатеричных чисел.
Мой код:
var3=`echo "ibase=16; $var1" | bc`
var4=`echo "ibase=16; $var2" | bc`
var5=$(($var4-$var3)) # [Line 48]
При выполнении я получаю такую ошибку:
Line 48: -: syntax error: operand expected (error token is "-")
Ответы:
Чтобы преобразовать шестнадцатеричный формат в десятичный, есть много способов сделать это в оболочке или с помощью внешней программы:
С участием удар:
с участием До нашей эры:
с участием Perl:
с участием Printf :
с участием питон:
с участием Рубин:
с участием Node.js:
с участием носорог:
с участием заводной:
источник
printf
решение POSIX? Если да, то это лучшее :)$((0xff))
, т.е. с шестнадцатеричным префиксом, подобным C, вместо16#
, хотяN#
это явно более общий вариант.echo $((077E9F2DBF49D100001#FF))
превышает предел 64-битного целого числа 2 ^ 64.bc
обрабатывает это правильно.Работа с очень легкой встроенной версией busybox в Linux означает, что многие традиционные команды недоступны (bc, printf, dc, perl, python)
Благодарим Питера Люнга за это решение.
источник
echo $((0x077E9F2DBF49D100001))
превышение предела 64-битного целого числа 2 ^ 64.bc
обрабатывает это правильноЕще один способ сделать это с помощью оболочки (bash или ksh, не работает с тире):
источник
#
символ? Есть ли другие приложения или документация, чтобы узнать больше о его использовании?В оболочке доступны различные инструменты. Sputnick дал вам отличный обзор ваших вариантов, основанный на вашем первоначальном вопросе. Он определенно заслуживает голосов за то время, которое потратил на то, чтобы дать вам несколько правильных ответов.
Еще одно, которого нет в его списке:
Но если все, что вы хотите сделать, это вычесть, зачем вообще менять ввод на основание 10?
Команда
dc
- «настольный расчет». Он также будет принимать входные данные со стандартного ввода, напримерbc
, но вместо использования «порядка операций» он использует нотацию стекирования («обратную польскую»). Вы даете ему входные данные, которые он добавляет в стек, затем даете ему операторы, которые выталкивают элементы из стека и возвращают результаты.В приведенных выше командах мы получили следующее:
16i
- сообщает DC принимать ввод с основанием 16 (шестнадцатеричный). Не меняет базу выпуска.BFCA3000
- ваш начальный номер17FF
- случайное шестнадцатеричное число, которое я выбрал для вычитания из вашего начального числа-
- возьмите два числа, которые мы вставили, и вычтите последнее из более раннего, затем поместите результат обратно в стекp
- распечатать последний элемент в стопке. Это не меняет стек, так что ...10o
- указывает dc печатать свой вывод в базе «10», но помните, что наша схема нумерации входных данных в настоящее время шестнадцатеричная, поэтому «10» означает «16».p
- снова распечатать последний элемент в стопке ... на этот раз в шестнадцатеричном формате.Вы можете создавать невероятно сложные математические решения с помощью постоянного тока. Это хорошо, если в вашем наборе инструментов есть сценарии оболочки.
источник
Сообщение об ошибке появляется, когда переменные имеют значение NULL (или пустые):
Это могло произойти из-за неправильного значения bc. Вполне может быть, что bc нужны значения ВЕРХНЕГО регистра. Необходимо
BFCA3000
, неbfca3000
. Это легко исправить в bash, просто используйте^^
расширение:Это изменит сценарий на это:
Но нет необходимости использовать bc [1], поскольку bash может выполнять перевод и вычитание напрямую:
[1] Примечание: я предполагаю, что значения могут быть представлены в 64-битной математике, так как разница была рассчитана в bash в вашем исходном скрипте. Bash ограничен целыми числами меньше ((2 ** 63) -1), если скомпилирован в 64 бита. Это будет единственное отличие от bc, у которого нет такого ограничения.
источник
В dash и других оболочках вы можете использовать
для преобразования шестнадцатеричного числа в десятичное. Это не относится к bash или ksh.
источник
printf "%d" 0xff