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' 

另外, zshbashecho本地支持这个:

 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