linux shell脚本:hexstring到字节
可以说,我有一个string5a
。 这是ASCII字母Z的hex表示。我需要知道一个Linux shell命令,它将采用hexstring并输出string表示的二进制字节。
所以,如果我这样做
echo 5a | command_im_looking_for > temp.txt
我打开temp.txt
,我会看到一个单独的字母Z.
echo -n 5a | perl -pe 's/([0-9a-f]{2})/chr hex $1/gie'
请注意,这不会跳过非hex字符。 如果你只想要hex(没有从原来的string等空白):
echo 5a | perl -ne 's/([0-9a-f]{2})/print chr hex $1/gie'
另外, zsh
和bash
在echo
本地支持这个:
echo -e '\x5a'
我曾经使用xxd来做到这一点
echo -n 5a | xxd -r -p
但后来我意识到,在Debian / Ubuntu中,xxd是vim-common的一部分,因此可能不在最小系统中。 为了避免perl(imho也不是最小系统的一部分),我最终使用sed,xargs和printf像这样:
echo -n 5a | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf
大多数情况下,我只想转换几个字节,这对于这样的任务是可以的。 这个解决scheme优于ghostdog74的优点是,它可以自动转换任意长度的hexstring。 因为printf没有从标准input读取,所以使用xargs。
你可以通过回声,而不是其他的东西。 不要忘记添加“-n”,否则您将自动获得换行符:
echo -n -e "\x5a"
猛击一class
echo -n "5a" | while read -N2 code; do printf "\x$code"; done
取决于你得到那个“5a”,你可以将\ x附加到它并传递给printf
$ a=5a $ a="\x${a}" $ printf "$a" Z
一些python3单线程与任何数量的字节一起工作。
解码hex( strip
,所以可以在stdin上换行):
$ echo 666f6f0a | python3 -c "import sys, binascii; sys.stdout.buffer.write(binascii.unhexlify(input().strip()))" foo
编码hex:
$ echo foo | python3 -c "import sys, binascii; print(binascii.hexlify(sys.stdin.buffer.read()).decode())" 666f6f0a
echo 5a | python -c "import sys; print chr(int(sys.stdin.read(),base=16))"
这是一个纯粹的bash脚本(因为printf是bash内build的):
#warning : spaces do matter die(){ echo "$@" >&2;exit 1;} p=48656c6c6f0a test $((${#p} & 1)) == 0 || die "length is odd" p2=''; for ((i=0; i<${#p}; i+=2));do p2=$p2\\x${p:$i:2};done printf "$p2"
如果bash已经在运行,这应该比其他任何启动新进程的解决scheme都快。
dc可以在数字基地之间转换:
$ echo 5a | (echo 16i; tr 'az' 'A-Z'; echo P) | dc Z$
GNU awk 4.1
awk -niord '$0=chr("0x"RT)' RS=.. ORS=
请注意,如果您回应到这将产生一个额外的空字节
$ echo 595a | awk -niord '$0=chr("0x"RT)' RS=.. ORS= | od -tx1c 0000000 59 5a 00 YZ \0
而是使用printf
$ printf 595a | awk -niord '$0=chr("0x"RT)' RS=.. ORS= | od -tx1c 0000000 59 5a YZ
另外请注意,GNU awk默认生成UTF-8
$ printf a1 | awk -niord '$0=chr("0x"RT)' RS=.. ORS= | od -tx1 0000000 c2 a1
如果您处理的是ASCII以外的字符,并且您将对Base64编码,则可以使用-b
来禁用UTF-8
echo 5a | sha256sum | awk -bniord 'RT~/\w/,$0=chr("0x"RT)' RS=.. ORS=
类似于我的答案在这里: Linux shell脚本:hex数到二进制string
你可以使用像这样的工具(使用ascii可打印字符而不是5a
)来完成:
echo -n 616263 | cryptocli dd -decoders hex
会产生以下结果:
abcd
od -c或者hexdump -c