在 bash 中反转十六进制数

在 bash 中反转十六进制数

有没有简单的命令可以反转十六进制数?

例如,给定十六进制数:

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+ tac+ tr

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

如果它有tacortail -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}

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

你可以将其转换为二进制,反转字节,可选地删除尾随换行符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 字节),则有效,因为rev将截断该点的输出,或者0a(换行符),因为rev反转每个线而不是整个输出。

答案4

(为了完整性)

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

相关内容