反转bash中的十六进制数


10

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

例如,给定十六进制数:

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我添加了答案,因为最适合我的答案是所选答案的注释。但是我可以删除它。
的Iñaki穆里略

2
您可以通过单击答案框下方的“回答此问题”按钮将其添加为答案(鼓励您自行回答),您应该不要将其放在问题中。

2
在我的C程序员想要说“010203”是一个八进制数,而不是一个十六进制数字(0x10203)
infixed

@infixed你没有错,但我想答案是对待010203为十六进制的,即使我不使用 0x
的Iñaki穆里略

Answers:


10

您可以将其转换为binary反转字节,可以选择删除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
的Iñaki穆里略

@ l0b0也是我,得到0102030a
爸爸

2
@IñakiMurillo在您的rev版本中2.20.1;用这个队友xxd -revert -plain <<< '030201' | LC_ALL=C rev | tr -d '\n'| xxd -plain
爸爸

2
rev版本之前2.24有一个新的bug。更多信息github.com/karelzak/util-linux/commit/…–
巴巴

1
如果十六进制字符串包含“ 00” NUL字节,则此方法不起作用。
西尔文·勒鲁

10

如果您的系统有rev命令。

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

如果它具有tacor 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)':)
森迪普•

1
@Sundeep,很好。我不知道有人可以那样使用-F。(我现在可以看到它在split()手册中描述)。
斯特凡Chazelas

1
据我所知,-F基本上是在拆分$_..除了使用正则表达式之外,-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'

这将还原每个十六进制行:

  • /(..)/g 建立包含捕获到的匹配项的列表


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.