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.