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 "-")
Author: VenkateshJN, 2012-11-08

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
 229
Author: Gilles Quenot,
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.

 32
Author: hinekyle,
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
 12
Author: Tomás Fox,
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.

 11
Author: ghoti,
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.

 3
Author: ,
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-08-29 22:34:54

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.

 1
Author: novice,
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