该脚本如何将十六进制转换为ascii?

时间:2019-07-15 09:59:59

标签: linux bash

我有一个可以将十六进制转换为ASCII的脚本,但是我不知道它是如何工作的。另外,我不确定是否正确。

我想知道它是如何工作的。 用法是./hexToASCII {十六进制字符串}> {file}

hex="$1"

# Convert Hexa decimal to ASCII
for i in $(awk -v len=$(expr "$hex" : '.*') 'BEGIN {for(i=1;i<len;i=i+2) print i;}')
do
  awk -v d=$(printf "ibase=16\n%s\n" $(echo $hex|cut -c$i-$(expr $i + 1)) | bc) 'BEGIN {printf("%c",d);}'
done

2 个答案:

答案 0 :(得分:1)

(不是该问题的真正答案。仅仅显示解决方案太复杂了。要解释其中的所有内容都需要很多时间。)

更简单的解决方案:

[STEP 101] # hex=68656C6C6F0A
[STEP 102] # echo $hex | sed 's/../\\x&/g'
\x68\x65\x6C\x6C\x6F\x0A
[STEP 103] # printf $(echo $hex | sed 's/../\\x&/g')
hello
[STEP 104] #
[STEP 105] # echo $hex | xxd -p -r
hello
[STEP 106] #

或纯Bash:

[STEP 107] # for ((i=0; i<${#hex}; i+=2)); do printf "\x${hex:i:2}"; done
hello
[STEP 108] #

答案 1 :(得分:0)

如果我们给出./hexToASCII 505152 然后在第1行: hex="$1"将是hex="505152"

从下一行开始:

for i in $(awk -v len=$(expr "$hex" : '.*') 'BEGIN {for(i=1;i<len;i=i+2) print i;}')

如果我们逐个表达式地表达,则:

$(expr "$hex" : '.*')

将给出表达式的长度。 awk -v len会将长度分配给变量len

诠释下一行:

for(i=1;i<len;i=i+2) print i;

它将打印值1,3,5,该值将由主循环for i in $(...)获取,并将开始对i的值(即1,3,5)执行循环

考虑下一行:

awk -v d=$(printf "ibase=16\n%s\n" $(echo $hex|cut -c$i-$(expr $i + 1)) | bc) 'BEGIN {printf("%c",d);}'

在这一行中

echo $hex|cut -c$i-$(expr $i + 1)

在第一次执行循环期间,i的值将为1,结果表达式将变为echo $505152|cut -c1-2,并输出50(剪切column1和column2)。它将以

打印
printf("%c",50)

到ascii P。

对于i的其他值,此操作将继续进行,从而将表达式505152剪切为50,51,52,并打印相应的ASCII。

简而言之,该脚本查找十六进制的长度,将其切成2的倍数(分开)并打印每段的ascii。