在 bash 中反转十六进制数

Iña*_*llo 10 command-line numeric-data hex

是否有一个简单的命令来反转十六进制数?

例如,给定十六进制数:

030201
Run Code Online (Sandbox Code Playgroud)

输出应该是:

010203
Run Code Online (Sandbox Code Playgroud)

使用该rev命令,我得到以下信息:

102030
Run Code Online (Sandbox Code Playgroud)

更新

$ 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
Run Code Online (Sandbox Code Playgroud)

Ipo*_*cer 11

fold+ tac+ tr

$ echo 030201|fold -w2|tac|tr -d "\n"
010203
Run Code Online (Sandbox Code Playgroud)
  • fold - 每 2 个字节拆分
  • tac - 反向猫
  • tr - 删除换行符


l0b*_*0b0 10

您可以将其转换为 binary反转 bytes,可选择删除尾随换行符rev<2.24,然后将其转换回:

$ xxd -revert -plain <<< 030201 | LC_ALL=C rev | tr -d '\n' | xxd -plain
010203
Run Code Online (Sandbox Code Playgroud)

使用

$ 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
Run Code Online (Sandbox Code Playgroud)

这并没有如果字符串包含NUL字节工作,因为rev将截断在该点的输出。

  • 我得到“0102030a”而不是“010203” (2认同)
  • @IñakiMurillo 在你的 `rev` 版本 `2.20.1` 中;使用这个格式 `xxd -revert -plain &lt;&lt;&lt; '030201' | LC_ALL=C 转 | tr -d '\n'| xxd -plain` (2认同)
  • `2.24` 版本之前的 `rev` 有一个换行错误。更多信息 https://github.com/karelzak/util-linux/commit/d267fdb8540202f77efb28fdf5dddd9826626757 (2认同)
  • 如果十六进制字符串包含“00”NUL 字节,则它不起作用。 (2认同)

Sté*_*las 10

如果您的系统有rev命令。

hex=030201
new_hex=$(printf %s "$hex" | dd conv=swab 2> /dev/null | rev)
Run Code Online (Sandbox Code Playgroud)

如果它有一个tacortail -r命令:

new_hex=$(echo "$hex" | fold -w 2 | tac | paste -sd '\0' -)
Run Code Online (Sandbox Code Playgroud)

zsh

setopt extendedglob
new_hex=${(j::)${(s::Oa)${hex//(#b)(?)(?)/$match[2]$match[1]}}}
Run Code Online (Sandbox Code Playgroud)

(就像在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"
)
Run Code Online (Sandbox Code Playgroud)

或者

new_hex=$(echo "$hex" |
  sed -e 'G;:1' -e 's/\(..\)\(.*\n\)/\2\1/;t1' -e 's/.//')
Run Code Online (Sandbox Code Playgroud)

perl

new_hex=$(perl -le 'print reverse(shift =~ /../g)' -- "$hex")
Run Code Online (Sandbox Code Playgroud)

  • 我打算建议`perl -F'(..)' -lane 'print reverse(@F)'` :) (3认同)

JJo*_*oao 6

perl -nE 'say reverse /(..)/g'
Run Code Online (Sandbox Code Playgroud)

这将恢复每个十六进制行:

  • /(..)/g用捕获的匹配建立一个列表