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
将截断在该点的输出。
Sté*_*las 10
如果您的系统有rev
命令。
hex=030201
new_hex=$(printf %s "$hex" | dd conv=swab 2> /dev/null | rev)
Run Code Online (Sandbox Code Playgroud)
如果它有一个tac
ortail -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 -nE 'say reverse /(..)/g'
Run Code Online (Sandbox Code Playgroud)
这将恢复每个十六进制行:
/(..)/g
用捕获的匹配建立一个列表