Kann mir jemand helfen, eine Hexadezimalzahl in einem Shell-Skript in eine Dezimalzahl umzuwandeln?
Ich möchte beispielsweise die Hexadezimalzahl bfca3000
mithilfe eines Shell-Skripts in eine Dezimalzahl konvertieren . Ich möchte grundsätzlich die Differenz zweier Hexadezimalzahlen.
Mein Code lautet:
var3=`echo "ibase=16; $var1" | bc`
var4=`echo "ibase=16; $var2" | bc`
var5=$(($var4-$var3)) # [Line 48]
Bei der Ausführung erhalte ich folgende Fehlermeldung:
Line 48: -: syntax error: operand expected (error token is "-")
Antworten:
Um von hexadezimal nach dezimal zu konvertieren, gibt es viele Möglichkeiten, dies in der Shell oder mit einem externen Programm zu tun:
Mit Bash::
mit bc::
mit perl::
mit printf ::
mit Python::
mit Rubin::
mit node.js::
mit Nashorn::
mit groovig::
quelle
printf
Lösung POSIX? Wenn ja, ist es das Beste :)$((0xff))
, dh mit C-ähnlichem Hex-Präfix anstelle von16#
, obwohl diesN#
deutlich allgemeiner ist.echo $((077E9F2DBF49D100001#FF))
Überlauf der 64-Bit-Ganzzahlgrenze von 2 ^ 64.bc
behandelt dies richtig.Der Umgang mit einer sehr leichten eingebetteten Version von Busybox unter Linux bedeutet, dass viele der herkömmlichen Befehle nicht verfügbar sind (bc, printf, dc, perl, python).
Dank an Peter Leung für diese Lösung.
quelle
echo $((0x077E9F2DBF49D100001))
Überlaufen der 64-Biit-Integer-Grenze von 2 ^ 64.bc
behandelt dies richtigEine weitere Möglichkeit, dies mit der Shell zu tun (bash oder ksh, funktioniert nicht mit Bindestrich):
quelle
#
Symbol? Gibt es andere Anwendungen oder Dokumentationen, um mehr über die Verwendung zu erfahren?Innerhalb einer Shell stehen Ihnen verschiedene Tools zur Verfügung. Sputnick hat Ihnen anhand Ihrer ersten Frage einen hervorragenden Überblick über Ihre Optionen gegeben. Er verdient definitiv Stimmen für die Zeit, die er damit verbracht hat, Ihnen mehrere richtige Antworten zu geben.
Eine weitere, die nicht auf seiner Liste steht:
Aber wenn Sie nur subtrahieren möchten, warum sollten Sie dann die Eingabe auf Basis 10 ändern?
Der
dc
Befehl lautet "Desk Calc". Es werden auch Eingaben von stdin wie verwendetbc
, aber anstatt "Reihenfolge der Operationen" zu verwenden, wird die Stapelnotation ("umgekehrte polnische") verwendet. Sie geben ihm Eingaben, die er einem Stapel hinzufügt, geben ihm dann Operatoren, die Elemente vom Stapel entfernen, und drücken die Ergebnisse zurück.In den obigen Befehlen haben wir Folgendes:
16i
- Weist DC an, Eingaben in Basis 16 (hexadezimal) zu akzeptieren. Ändert die Ausgangsbasis nicht.BFCA3000
- Ihre ursprüngliche Nummer17FF
- eine zufällige Hex-Zahl, die ich ausgewählt habe, um von Ihrer ursprünglichen Zahl abzuziehen-
- Nehmen Sie die beiden Zahlen, die wir gedrückt haben, und subtrahieren Sie die spätere von der früheren. Schieben Sie dann das Ergebnis zurück auf den Stapelp
- Drucken Sie das letzte Element auf dem Stapel. Dies ändert den Stapel nicht, also ...10o
- weist dc an, seine Ausgabe in der Basis "10" zu drucken, aber denken Sie daran, dass unser Eingabenummerierungsschema derzeit hexadezimal ist, sodass "10" "16" bedeutet.p
- Drucke den letzten Gegenstand erneut auf den Stapel ... diesmal in hex.Mit DC können Sie sagenhaft komplexe mathematische Lösungen erstellen. Es ist eine gute Sache, Shell-Skripte in Ihrer Toolbox zu haben.
quelle
Der gemeldete Fehler wird angezeigt, wenn die Variablen null (oder leer) sind:
Dies könnte passieren, weil der Wert für bc falsch war. Das könnte gut sein, dass bc UPPERcase-Werte benötigt. Es braucht
BFCA3000
nichtbfca3000
. Das lässt sich leicht in Bash beheben, verwenden Sie einfach die^^
Erweiterung:Dadurch wird das Skript folgendermaßen geändert:
Es ist jedoch nicht erforderlich, bc [1] zu verwenden, da bash die Übersetzung und Subtraktion direkt durchführen könnte:
[1] Hinweis: Ich gehe davon aus, dass die Werte in 64-Bit-Mathematik dargestellt werden können, da die Differenz in Ihrem ursprünglichen Skript in Bash berechnet wurde. Bash ist auf Ganzzahlen kleiner als ((2 ** 63) -1) beschränkt, wenn es in 64 Bit kompiliert wird. Dies ist der einzige Unterschied zu bc, für den es keine solche Grenze gibt.
quelle
In Dash und anderen Shells können Sie verwenden
um eine Hexadezimalzahl in eine Dezimalzahl umzuwandeln. Dies ist nicht bash oder ksh-spezifisch.
quelle
printf "%d" 0xff