Bashの逆方向16進数

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

答え1

fold++で:tactr

$ echo 030201|fold -w2|tac|tr -d "\n"
010203
  • fold- 2バイトごとに分割
  • tac- リバース猫
  • tr- 改行文字を削除

答え2

システムに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[]))。

または:

printf -v new_hex '%2$s%1$s' ${(s[]Oa)hex}

POSIX的に:

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")

答え3

あなたはできますバイナリに変換リバースバイト、オプションで末尾の改行を削除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

これは実際にいいえ文字列に00(NULバイト)が含まれている場合は、その点の出力が切り捨てられるかrev0a改行)が含まれているrev場合に有効です。ワイヤーフル出力ではなく

答え4

(完全さのために)

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

関連情報