bashで16進数を逆にします


10

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

2
質問への回答は追加しないでください。

@cat私が役に立ったのは選択した回答のコメントにあるため、回答を追加しました。しかし、削除しても大丈夫です。
イニャキムリーリョ

2
回答ボックスの下にある[この質問に答える]ボタンをクリックして回答として追加できます(自己回答が推奨されます)。質問には入れないでください。

2
私の中でCプログラマは「010203」と言いたい進数ではなく、進数(0x10203)である
infixed

@infixedあなたは間違っていませんが、私は扱う答えを求めていました 010203私が使用していないにも関わらず、16進数 0x
イニャキムリーリョ

回答:


10

これをバイナリ変換し、バイトを逆にし、オプションで後続の改行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

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


2
私の0102030a代わりに010203
イニャキムリーリョ2016年

@ l0b0と私も、取得0102030a
بارپابابا

2
あなたのrevバージョンでの@IñakiMurillo 2.20.1; このギ酸塩を使用xxd -revert -plain <<< '030201' | LC_ALL=C rev | tr -d '\n'| xxd -plain
بارپابابا

2
revバージョンの前に2.24改行バグがあります。より詳しい情報 github.com/karelzak/util-linux/commit/...
بارپابابا

1
16進文字列に '00' NULバイトが含まれている場合は機能しません。
Sylvain Leroux

10

システムに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")

3
私は提案するつもりでしたperl -F'(..)' -lane 'print reverse(@F)':)
Sundeep

1
@サンディープ、いいね。こんな-F風に使えるなんて知らなかった。(私はそれがsplit()今マニュアルに記述されているのを見ることができます)。
ステファンChazelas

1
私の知る限りで-Fは、基本的には分割$_です.. regexを使用することとは別に-F'/"\K\|(?=")/'、分割数を指定することもできます...のように-F'/:/,$_,2'... ()セパレータもキャプチャする必要がある場合に使用します
Sundeep

貼り付けの代わりに使用できますtr -d '\n'
AKHolland

10

fold+ tac+ tr

$ echo 030201|fold -w2|tac|tr -d "\n"
010203
  • fold -2バイトごとに分割
  • tac -リバースキャット
  • tr -改行を削除します

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

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

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


0

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.