web-dev-qa-db-ja.com

bashで16進数を逆にします

16進数を逆にする簡単なコマンドはありますか?

たとえば、16進数を指定すると、次のようになります。

030201

出力は次のようになります。

010203

revコマンドを使用して、以下を取得します。

102030

更新

$ 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
10
Iñaki Murillo

バイナリに変換バイトを反転 、オプションで 末尾の改行rev <2.24 を削除し、元に戻すことができます。

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

使用する

$ 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

revはその時点で出力を切り捨てるため、文字列にNULバイトが含まれている場合、これは機能しません

10
l0b0

システムにrevコマンドがある場合。

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

tacまたはtail -rコマンド:

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

zshの場合:

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

ddアプローチのように:文字のペアを交換し、個々の文字のリストに分割します(s::)、順序を逆転(Oa)して結合(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"
)

または

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

Perlの場合:

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

fold + tac + trの場合:

$ echo 030201|fold -w2|tac|tr -d "\n"
010203
  • fold-2バイトごとに分割
  • tac-逆の猫
  • tr-改行を削除
10
Ipor Sircer
Perl -nE 'say reverse /(..)/g'

これにより、16進数の各行が元に戻ります。

  • /(..)/gキャプチャされた一致を含むリストを作成します
4
JJoao

(完全を期すため)

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

Ipor Sircerの回答に基づく https://unix.stackexchange.com/a/321867/337458~/.bashrc呼び出すことができる素敵なコマンドを作成するには:

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

$> hex_inverse 030201

010203
0
mschmoock