Kehren Sie eine Hexadezimalzahl in Bash um


10

Gibt es einen einfachen Befehl zum Umkehren einer Hexadezimalzahl?

Beispiel: Hexadezimalzahl:

030201

Die Ausgabe sollte sein:

010203

Mit dem revBefehl erhalte ich Folgendes:

102030

Aktualisieren

$ bash --version | head -n1
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
$ xxd -version
xxd V1.10 27oct98 by Juergen Weigert
$ rev --version
rev from util-linux 2.20.1

2
Bitte fügen Sie die Antwort nicht zu Ihrer Frage hinzu.
— Katze

@cat Ich habe die Antwort hinzugefügt, da die für mich funktionierende Antwort in den Kommentaren der ausgewählten Antwort enthalten ist. Aber ich bin in Ordnung, es zu entfernen.
— Iñaki Murillo

2
Sie können es als Antwort hinzufügen, indem Sie auf die Schaltfläche "Diese Frage beantworten" unter dem Antwortfeld klicken (Selbstantworten werden empfohlen). Sie sollten es einfach nicht in die Frage einfügen.
— Katze

2
Der C-Programmierer in mir möchte sagen, dass "010203" eine Oktalzahl ist, keine Hexadezimalzahl (0x10203)
— eingefügt

@infixed Sie sind nicht falsch, aber ich wollte eine Antwort, die 010203als hexadezimal behandelt wird , obwohl ich nicht benutze 0x
— Iñaki Murillo

Antworten:


10

Sie können es in eine Binärdatei konvertieren , die Bytes umkehren , optional nachgestellte Zeilenumbrüche rev<2,24 entfernen und es zurückkonvertieren:

$ xxd -revert -plain <<< 030201 | LC_ALL=C rev | tr -d '\n' | xxd -plain
010203

Verwenden von

$ bash --version | head -n1
GNU bash, version 4.3.42(1)-release (x86_64-redhat-linux-gnu)
$ xxd -version
xxd V1.10 27oct98 by Juergen Weigert
$ rev --version
rev from util-linux 2.28.2

Dies funktioniert nicht , wenn die Zeichenfolge das NUL-Byte enthält, da revdie Ausgabe an diesem Punkt abgeschnitten wird.


2
Ich bekomme 0102030astatt010203
— Iñaki Murillo

@ l0b0 und auch ich, bekommen0102030a
— ارپابابا

2
@ IñakiMurillo in deiner revVersion 2.20.1; Verwenden Sie dieses xxd -revert -plain <<< '030201' | LC_ALL=C rev | tr -d '\n'| xxd -plain
— Format

2
revVor der Version 2.24gibt es einen neuen Zeilenfehler. Weitere Informationen github.com/karelzak/util-linux/commit/…
— ارپابابا

1
Es funktioniert nicht, wenn die Hex-Zeichenfolge das NUL-Byte '00' enthält.
— Sylvain Leroux

10

Wenn Ihr System einen revBefehl hat.

hex=030201
new_hex=$(printf %s "$hex" | dd conv=swab 2> /dev/null | rev)

Wenn es einen tacoder tail -rBefehl hat:

new_hex=$(echo "$hex" | fold -w 2 | tac | paste -sd '\0' -)

Mit zsh:

setopt extendedglob
new_hex=${(j::)${(s::Oa)${hex//(#b)(?)(?)/$match[2]$match[1]}}}

(wie im ddAnsatz: Tauschen Sie Zeichenpaare aus, teilen Sie sie in eine Liste einzelner Zeichen auf ( s::), kehren Sie die Reihenfolge um ( Oa) und verbinden Sie ( j::)).

POSIXly:

new_hex=$(
  awk '
    BEGIN {
      hex = ARGV[1]; l = length(hex)
      for (i = 1; i < l; i += 2)
        new_hex = substr(hex, i, 2) new_hex
      print new_hex
    }' "$hex"
)

Oder

new_hex=$(echo "$hex" |
  sed -e 'G;:1' -e 's/\(..\)\(.*\n\)/\2\1/;t1' -e 's/.//')

Mit perl:

new_hex=$(perl -le 'print reverse(shift =~ /../g)' -- "$hex")

3
Ich wollte vorschlagen perl -F'(..)' -lane 'print reverse(@F)':)
— Sundeep

1
@Sundeep, schön. Ich wusste nicht, dass man so etwas gebrauchen kann -F. (Ich kann es split()jetzt im Handbuch beschrieben sehen).
— Stéphane Chazelas

1
Soweit ich weiß, -Fwird im Grunde genommen aufgespalten $_... abgesehen von der Verwendung von Regex, wie -F'/"\K\|(?=")/'man auch die Anzahl der Teilungen angeben kann ... wie -F'/:/,$_,2'... verwenden, ()wenn das Trennzeichen ebenfalls erfasst werden muss
— Sundeep

Anstatt Paste zu verwenden, könnten Sietr -d '\n'
— AKHolland

10

Mit fold+ tac+ tr:

$ echo 030201|fold -w2|tac|tr -d "\n"
010203
  • fold - Alle 2 Bytes aufteilen
  • tac - Rückwärtskat
  • tr - Zeilenumbrüche entfernen

4
perl -nE 'say reverse /(..)/g'

Dies kehrt jede hexadezimale Linie zurück:

  • /(..)/g Erstellt eine Liste mit den erfassten Übereinstimmungen

4

(der Vollständigkeit halber)

$ echo 030201 | grep -o .. | tac | paste -sd '' -
010203

1
Dies funktioniert, wenn sich das NUL-Byte '00' in der Eingabe befindet.
— Sylvain Leroux

0

Basierend auf der Antwort von Ipor Sircer /unix//a/321867/337458 würde ich dies in Ihrem empfehlen ~/.bashrc, um einen netten Befehl zu haben, den Sie einfach aufrufen können:

function hex_inverse() {
    echo ${1} | fold -w2 | tac | tr -d "\n" ; echo "" 
}

$> hex_inverse 030201

010203
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.