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
バイナリに変換 、 バイトを反転 、オプションで 末尾の改行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バイトが含まれている場合、これは機能しません。
システムに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")
fold
+ tac
+ tr
の場合:
$ echo 030201|fold -w2|tac|tr -d "\n"
010203
fold
-2バイトごとに分割tac
-逆の猫tr
-改行を削除Perl -nE 'say reverse /(..)/g'
これにより、16進数の各行が元に戻ります。
/(..)/g
キャプチャされた一致を含むリストを作成します(完全を期すため)
$ echo 030201 | grep -o .. | tac | paste -sd '' -
010203
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