Command-Line

在bash中反轉十六進制數

  • October 25, 2021

是否有一個簡單的命令來反轉十六進制數?

例如,給定十六進制數:

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

使用fold+ tac+ tr

$ echo 030201|fold -w2|tac|tr -d "\n"
010203
  • fold- 每 2 個字節拆分一次
  • tac- 反向貓
  • tr- 刪除換行符

如果你的系統有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")

引用自:https://unix.stackexchange.com/questions/321860