Szesnastkowy do dziesiętnego w skrypcie powłoki
Czy ktoś może mi pomóc w podpowiedzeniu jak przekonwertować liczbę szesnastkową na dziesiętną w skrypcie powłoki? Np. chcę przekonwertować liczbę szesnastkową bfca3000
na dziesiętną za pomocą skryptu powłoki. Zasadniczo chcę różnicy dwóch liczb szesnastkowych. Mój kod to:
var3=`echo "ibase=16; $var1" | bc`
var4=`echo "ibase=16; $var2" | bc`
var5=$(($var4-$var3)) # [Line 48]
Po wykonaniu, dostaję błąd jako:
Line 48: -: syntax error: operand expected (error token is "-")
6 answers
Aby przekonwertować hex2dec, można to zrobić na wiele sposobów w powłoce lub skrypcie:
Z bash (uwaga na białe spacje):
$ echo $(( 16#FF ))
255
Zbc :
$ echo "ibase=16; FF" | bc
255
Z perl :
$ perl -le 'print hex("FF");'
255
Zprintf :
$ printf "%d\n" 0xFF
255
Z python :
$ python -c 'print(int("FF", 16))'
255
Zruby :
$ ruby<<EOF
p "FF".to_i(16).to_s(10)
EOF
"255"
Z węzłem.js :
$ nodejs <<< "console.log(parseInt('FF', 16))"
255
Z nosorożec:
$ rhino<<EOF
print(parseInt('FF', 16))
EOF
...
255
Z groovy :
$ groovy -e 'println Integer.parseInt("FF",16)'
255
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-24 13:14:58
Obsługa bardzo lekkiej wbudowanej wersji busybox na Linuksie oznacza, że wiele tradycyjnych poleceń nie jest dostępnych (bc, printf, dc, perl, python)
echo $((0x2f))
47
hexNum=2f
echo $((0x${hexNum}))
47
Kredyt dla Peter Leung Za To rozwiązanie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-04 12:48:47
Jeszcze jeden sposób, aby to zrobić używając powłoki (bash lub ksh, nie działa z dash):
echo $((16#FF))
255
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-14 07:26:49
Różne narzędzia są dostępne dla Ciebie z poziomu powłoki. Sputnick dał ci doskonały przegląd opcji, w oparciu o Twoje początkowe pytanie. Zdecydowanie zasługuje na głosy za czas, który spędził dając Ci wiele poprawnych odpowiedzi.
Jeszcze jeden, którego nie ma na liście:
[ghoti@pc ~]$ dc -e '16i BFCA3000 p'
3217698816
Ale jeśli wszystko, co chcesz zrobić, to odjąć, po co zawracać sobie głowę zmianą wejścia na bazę 10?
[ghoti@pc ~]$ dc -e '16i BFCA3000 17FF - p 10o p'
3217692673
BFCA1801
[ghoti@pc ~]$
Komenda dc
to "desk calc". Będzie również pobierał dane wejściowe ze standardowego wejścia, jak bc
, zamiast jednak używać "kolejności operacji", używa notacji stacking ("reverse Polish"). Dajesz mu dane wejściowe, które dodaje do stosu, a następnie dajesz operatory, które usuwają elementy ze stosu i cofają wyniki.
W poleceniach powyżej mamy następujące:
-
16i
-- mówi dc, aby zaakceptował wejście w bazie 16 (szesnastkowej). Nie zmienia bazy wyjściowej. -
BFCA3000
-- Twój numer początkowy -
17FF
-- a random liczba szesnastkowa, którą wybrałem, aby odjąć od twojej liczby początkowej -
-
-- weź dwie liczby, które wypchnęliśmy, i odjmij późniejszą od poprzedniej, a następnie przesuń wynik z powrotem na stos -
p
-- wyświetla ostatnią pozycję na stosie. To nie zmienia stosu, więc... -
10o
-- mówi dc, aby wydrukował swoje wyjście w bazie "10", ale pamiętaj, że nasz schemat numeracji wejściowej jest obecnie szesnastkowy, więc " 10 " oznacza "16". -
p
-- ponownie wyświetla ostatnią pozycję na stosie ... tym razem w hex.
Możesz konstruować bajecznie złożone rozwiązania matematyczne za pomocą dc. Dobrze jest mieć w swojej skrzynce narzędziowej skrypty powłoki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-08 00:21:01
Zgłoszony błąd pojawia się, gdy zmienne są null (lub puste):
$ unset var3 var4; var5=$(($var4-$var3))
bash: -: syntax error: operand expected (error token is "-")
To mogło się zdarzyć, ponieważ wartość podana bc była Niepoprawna. Może być tak, że bc potrzebuje wielkich wartości. Potrzebuje BFCA3000
, a nie bfca3000
. Można to łatwo naprawić w bash, wystarczy użyć rozszerzenia ^^
:
var3=bfca3000; var3=`echo "ibase=16; ${var1^^}" | bc`
To zmieni skrypt na ten:
#!/bin/bash
var1="bfca3000"
var2="efca3250"
var3="$(echo "ibase=16; ${var1^^}" | bc)"
var4="$(echo "ibase=16; ${var2^^}" | bc)"
var5="$(($var4-$var3))"
echo "Diference $var5"
Ale nie ma potrzeby używania bc [1], ponieważ bash mógłby wykonać tłumaczenie i odejmowanie bezpośrednio:
#!/bin/bash
var1="bfca3000"
var2="efca3250"
var5="$(( 16#$var2 - 16#$var1 ))"
echo "Diference $var5"
[1]Uwaga: zakładam, że wartości mogą być reprezentowane w 64-bitowej matematyce, ponieważ różnica została obliczona w bash w oryginalnym skrypcie. Bash jest ograniczony do liczb całkowitych mniejszych niż ((2**63)-1), jeśli jest skompilowany w 64 bitach. To będzie jedyna różnica z bc, który nie ma takiego limitu.
W desce rozdzielczej i innych muszlach można użyć
printf "%d\n" (your hexadecimal number)
Do konwersji liczby szesnastkowej na dziesiętną. To nie jest bash, ani KSH, specyficzne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-12 21:36:35