linux shell脚本:十六进制字符串到字节

Kry*_*ski 58 linux bash shell scripting encoding

让我们说我有一个字符串5a.这是ASCII字母Z的十六进制表示.我需要知道一个Linux shell命令,它将采用十六进制字符串并输出字符串表示的二进制字节.

所以,如果我这样做

echo 5a | command_im_looking_for
Run Code Online (Sandbox Code Playgroud)

我打开Z,我会看到一封孤零零的字母Z.

jos*_*sch 86

我曾经使用xxd做到这一点

echo -n 5a | xxd -r -p
Run Code Online (Sandbox Code Playgroud)

但后来我意识到在Debian/Ubuntu中,xxd是vim-common的一部分,因此可能不存在于最小系统中.为了避免使用perl(imho也不是最小系统的一部分),我最终使用了sed,xargs和printf,如下所示:

echo -n 5a | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf
Run Code Online (Sandbox Code Playgroud)

大多数情况下,我只想转换几个字节,这对于这样的任务是可以的.这个解决方案优于ghostdog74的优点是,它可以自动转换任意长度的十六进制字符串.使用xargs是因为printf不从标准输入读取.

  • 该死,我知道这是3年后的原始答复,但是我不知道xxd的存在。考虑到我现在遇到的问题,我一直对此有需求...调试器不断对字节字符串进行十六进制转储。是的,@ Vouze的评论是毫无意义的。 (2认同)
  • 而不是`"echo -n 5a | xxd -r -p"`,我更喜欢使用`"xxd -r -p <<< 5a"`。**优点:** ***(1)*** 少输入几个字符(由于 3 次重复,输入速度也更快);***(2)*** 只运行 *one* 命令(保存 `echo`),而不是 *two* => 更快的执行。 (2认同)

bdo*_*lan 59

echo -n 5a | perl -pe 's/([0-9a-f]{2})/chr hex $1/gie'
Run Code Online (Sandbox Code Playgroud)

请注意,这不会跳过非十六进制字符.如果你只想要十六进制(没有来自原始字符串的空格等):

echo 5a | perl -ne 's/([0-9a-f]{2})/print chr hex $1/gie'
Run Code Online (Sandbox Code Playgroud)

此外,zshbash在本地支持这个echo:

echo -e '\x5a'
Run Code Online (Sandbox Code Playgroud)

  • `echo -ne'\ x5a'`是必要的,给出了一个例子:如果没有-n开关用于echo,则在Z之后输出一个新行('\ x0a'). (8认同)
  • 更容易使用`perl -lne'打印包"H*",$ _'`. (7认同)

Fa1*_*gel 14

你可以通过echo而不用其他东西来实现它.不要忘记添加"-n",否则您将自动获得换行符:

echo -n -e "\x5a"
Run Code Online (Sandbox Code Playgroud)


use*_*194 9

Bash one-liner

echo -n "5a" | while read -N2 code; do printf "\x$code"; done
Run Code Online (Sandbox Code Playgroud)


Jac*_*nor 5

一些可处理任意数量字节的 Python 3 单行代码。

解码十六进制

使用strip, 这样就可以在标准输入上添加换行符。

$ echo 666f6f0a | python3 -c "import sys, binascii; sys.stdout.buffer.write(binascii.unhexlify(input().strip()))"
foo
Run Code Online (Sandbox Code Playgroud)

十六进制编码

$ echo foo | python3 -c "import sys, binascii; print(binascii.hexlify(sys.stdin.buffer.read()).decode())"
666f6f0a
Run Code Online (Sandbox Code Playgroud)