Czy ktoś może mi pomóc w konwersji liczby szesnastkowej na dziesiętną w skrypcie powłoki?
Na przykład chcę przekonwertować liczbę szesnastkową bfca3000
na dziesiętną za pomocą skryptu powłoki. Zasadniczo chcę różnicę 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]
Podczas wykonywania otrzymuję ten błąd:
Line 48: -: syntax error: operand expected (error token is "-")
Odpowiedzi:
Aby przekonwertować z szesnastkowego na dziesiętny, można to zrobić na wiele sposobów w powłoce lub w zewnętrznym programie:
Z grzmotnąć:
z pne:
z perl:
z printf :
z pyton:
z rubin:
z node.js:
z nosorożec:
z groovy:
źródło
printf
rozwiązanie jest zgodne z POSIX? Jeśli tak, to jest najlepsze :)$((0xff))
, tj. Z przedrostkiem szesnastkowym podobnym do C zamiast16#
, chociażN#
jest to wyraźnie bardziej ogólne.echo $((077E9F2DBF49D100001#FF))
Przekracza limit 64-bitowych liczb całkowitych 2 ^ 64.bc
radzi sobie z tym prawidłowo.Radzenie sobie z bardzo lekką osadzoną wersją busybox w systemie Linux oznacza, że wiele tradycyjnych poleceń nie jest dostępnych (bc, printf, dc, perl, python)
Problem zgłosili Peter Leung dla tego rozwiązania.
źródło
echo $((0x077E9F2DBF49D100001))
Przekracza limit 64-bitowych liczb całkowitych wynoszący 2 ^ 64.bc
radzi sobie z tym właściwieJeszcze jeden sposób na zrobienie tego za pomocą powłoki (bash lub ksh, nie działa z myślnikiem):
źródło
#
symbol? Czy są jakieś inne aplikacje lub dokumentacja, w których można przeczytać więcej na temat ich użycia?Z poziomu powłoki dostępne są różne narzędzia. Sputnick udzielił Ci doskonałego przeglądu dostępnych opcji, w oparciu o Twoje wstępne pytanie. Zdecydowanie zasługuje na głosy za czas, który spędził, udzielając wielu poprawnych odpowiedzi.
Jeszcze jeden, którego nie ma na jego liście:
Ale jeśli wszystko, co chcesz zrobić, to odjąć, po co przejmować się zmianą danych wejściowych na podstawę 10?
dc
Polecenia jest „biurko oblicz”. Będzie również pobierał dane wejściowe ze stdin, na przykładbc
, ale zamiast używać „kolejności operacji”, używa notacji stosowej („odwrotnej Polski”). Dajesz mu dane wejściowe, które dodaje do stosu, a następnie dajesz operatorom, które zdejmują elementy ze stosu i odkładają wyniki.W powyższych poleceniach mamy:
16i
- mówi dc, aby zaakceptował dane wejściowe o podstawie 16 (szesnastkowej). Nie zmienia podstawy wyjściowej.BFCA3000
- Twój numer początkowy17FF
- losowa liczba szesnastkowa, którą wybrałem, aby odjąć od twojej początkowej liczby-
- weź dwie liczby, które zepchnęliśmy i odejmij późniejszą od poprzedniej, a następnie odłóż wynik z powrotem na stosp
- wydrukuj ostatni element na stosie. To nie zmienia stosu, więc ...10o
- mówi dc, aby wypisał swoje wyjście w bazie „10”, ale pamiętaj, że nasz schemat numerowania wejść jest obecnie szesnastkowy, więc „10” oznacza „16”.p
- wydrukuj ponownie ostatni przedmiot ze stosu ... tym razem w formacie hex.Za pomocą dc możesz tworzyć bajecznie złożone rozwiązania matematyczne. Dobrze jest mieć w swoim zestawie narzędzi do skryptów powłoki.
źródło
Zgłoszony błąd pojawia się, gdy zmienne są puste (lub puste):
Może się tak zdarzyć, ponieważ wartość nadana bc była nieprawidłowa. Może się tak zdarzyć, że bc potrzebuje WIELKICH liter. Musi
BFCA3000
, niebfca3000
. Można to łatwo naprawić w bash, po prostu użyj^^
rozszerzenia:To zmieni skrypt na ten:
Ale nie ma potrzeby używania bc [1], ponieważ bash mógłby bezpośrednio wykonać tłumaczenie i odejmowanie:
[1] Uwaga: Zakładam, że wartości można przedstawić 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 kompilowany na 64 bitach. To będzie jedyna różnica z bc, która nie ma takiego limitu.
źródło
W myślniku i innych muszlach możesz użyć
aby przekonwertować liczbę szesnastkową na dziesiętną. To nie jest specyficzne dla bash ani ksh.
źródło
printf "%d" 0xff