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不从标准输入读取.
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)
此外,zsh
并bash
在本地支持这个echo
:
echo -e '\x5a'
Run Code Online (Sandbox Code Playgroud)
Fa1*_*gel 14
你可以通过echo而不用其他东西来实现它.不要忘记添加"-n",否则您将自动获得换行符:
echo -n -e "\x5a"
Run Code Online (Sandbox Code Playgroud)
Bash one-liner
echo -n "5a" | while read -N2 code; do printf "\x$code"; done
Run Code Online (Sandbox Code Playgroud)
一些可处理任意数量字节的 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)