Wie lese ich einen String als Hex-Zahl in Bash?

7

Ich habe die Bash-Linie:

expr substr $SUPERBLOCK 64 8

Welches ist zurück zu mir String Line:

00080000

Ich weiß, dass dies tatsächlich ein 0x00080000 in Little-Endian ist. Gibt es eine Möglichkeit, daraus eine Ganzzahlvariable in Bash in Big-Endian wie 0x80000 zu erstellen?

DenisNovac
quelle

Antworten:

8

Wahrscheinlich ein besserer Weg, dies zu tun, aber ich habe diese Lösung gefunden, die die Zahl in Dezimalzahlen und dann zurück in Hex umwandelt (und die Zahl manuell hinzufügt 0x):

printf '0x%x\n' "$((16#00080000))"

Was Sie schreiben könnten als:

printf '0x%x\n' "$((16#$(expr substr "$SUPERBLOCK" 64 8)))"
jesse_b
quelle
Vielen Dank! Ich habe tatsächlich | rev inside hinzugefügt, um in Big-Endian zu konvertieren: printf "$ ((16 # $ (expr substr $ SUPERBLOCK 64 8 | rev)))"
DenisNovac
5
@DenisNovac Ich bin mir nicht sicher, ob Sie Big / Little Endian richtig verwenden (vielleicht haben Sie etwas anderes im Sinn, aber ich mache zum Spaß Assembler-Programmierung, also ist Endianness pro Byte), aber 0x12345678 ist in anderen Endianness 0x78563412, nicht 0x87654321. (und der Wert in Ihrer Frage 00080000ist nach Byte-Tausch 00000800, dh 2048 Dezimal)
Ped7g
Oh, du hast recht. Ich habe gerade die richtige Antwort auf die falsche Weise bekommen. Ich schreibe einen Code von Python zu Bash um, damit ich alle Antworten kenne, bevor ich sie bekomme.
DenisNovac
@DenisNovac: Sie hatten nicht die richtige Antwort. 0x8000 war ursprünglich in Ihrer Frage, die nicht mit 0x80000 oder 0x00080000 identisch ist
jesse_b
Ja, aber ich musste genau 0x8000 bekommen, also habe ich irgendwo einen Fehler gemacht. Das ist versetzt oder so.
DenisNovac
5

Es gibt zwei mehr oder weniger standardmäßige (und alte) Befehlszeilen-Unix-Tools, die sehr einfache Möglichkeiten zum Konvertieren von Zahlen zwischen verschiedenen Basen bieten:

$ { echo '16'; echo i; echo 00080000; echo p; } | dc
524288
$ { echo 'ibase=16'; echo 00080000; } | bc  
524288

Für den normalen menschlichen Gebrauch bevorzuge ich es sehr bc, aber wenn ich ein Programm schreibe, das Code generiert, insbesondere aus einem Parser, ist es dcmöglicherweise einfacher, mit einem stapelbasierten Tool umzugehen (und tatsächlich war die Originalversion von bcein Front-End Parser für dc).

Greg A. Woods
quelle