使用"xxd"的二进制到 ASCII 转换



我知道如何将十六进制转储转换为ASCII。

echo 54 58 72 56 etc | xxd -r -p -> 将产生 ASCII 输出

但是我正在努力将以下二进制代码转换为 ASCII。

01000001 01110010 01100101 01101110 00100111 01110100 00100000 01111001 01101111 01110101 00100000 01100001 00100000 01101100 01101001 01110100 01110100 01101100 01100101 00100000 01110011 01101000 01101111 01110010 01110100 00100000 01100110 01101111 01110010 00100000 01100001 00100000 01110011 01110100 01101111 01110010 01101101 00100000 01110100 01110010 01101111 01101111 01110000 01100101 01110010 00111111 00001101 00001010

我需要使用"xxd"或类似的尽可能短的命令来执行此操作。

提前谢谢你!

如果你想

坚持使用xxd,那么你需要首先将每个二进制数转换为十进制。如果您使用的是 bash ,并且x包含二进制字符串,则:

for a in $x; do printf "%x" $((2#$a)); done | xxd -r -p 

$((2#$a)) 在 bash 中是二进制到十进制的转换,printf会将其转换为十六进制。然后只需通过管道将其传送到xxd - 并得到您之前得到的东西。

你不是有点矮冲锋队吗?

如果字符串包含在文件中,请逐行读取,然后逐字读取。另一种选择是仅使用 printf ,但随后您需要八进制数,因此使用printf两次:

for a in $x; do printf \$(printf "%o" $((2#$a))); done

实际上最后一个也可以用hex来完成,只需使用而不是\ \x%o恢复到%x

解决此问题

的一个行是:

data=$(cat file.in); echo $(printf '%xn' "$((2#$data))") | xxd -r -p > file.out

问题是printf似乎有一个字符限制,可以通过将数据标记成你的钻机可以处理的块来解决,例如。 每个 8 个字节(在我的 Ubuntu 16.04.7 上(

一种解决方法是一次循环一个字符(字节序列(或从文件中循环一行:

data=$(cat file.in); for byte in $data; do echo $(printf '%xn' "$((2#$byte))"); done | xxd -r -p

在分隔成单词之前,无需转换为八进制或逐行阅读。

字典/数据库/数组可能是另一种但速度较慢的解决方案(如果您有足够的内存或不想将数据存储在文件中(:

D2B=(01000001 01110010 01100101 01101110 00100111 01110100 00100000 01111001 01101111 01110101 00100000 01100001 00100000 01101100 01101001 01110100 01110100 01101100 01100101 00100000 01110011 01101000 01101111 01110010 01110100 00100000 01100110 01101111 01110010 00100000 01100001 00100000 01110011 01110100 01101111 01110010 01101101 00100000 01110100 01110010 01101111 01101111 01110000 01100101 01110010 00111111 00001101 00001010); 
count=${#D2B[@]}; 
run='D2C=('${D2B[@]}'); for word in {0..'$count'}; do echo -n $(printf '%x' "$((2#${D2C[$word]}))"); done;';
echo "$run" | bash | xxd -r -p

或传递给数组的字符串解决方案以获得更快的响应:

dat="01000001 01110010 01100101 01101110 00100111 01110100 00100000 01111001 01101111 01110101 00100000 01100001 00100000 01101100 01101001 01110100 01110100 01101100 01100101 00100000 01110011 01101000 01101111 01110010 01110100 00100000 01100110 01101111 01110010 00100000 01100001 00100000 01110011 01110100 01101111 01110010 01101101 00100000 01110100 01110010 01101111 01101111 01110000 01100101 01110010 00111111 00001101 00001010"; 
count=$(echo $dat ^| wc -w); 
run='D2C=('$dat'); for word in {0..'$count'}; do echo -n $(printf '%x' "$((2#${D2C[$word]}))"); done;'; 
echo "$run" | bash | xxd -r -p

仅字符串解决方案(无数组(:

dat="01000001 01110010 01100101 01101110 00100111 01110100 00100000 01111001 01101111 01110101 00100000 01100001 00100000 01101100 01101001 01110100 01110100 01101100 01100101 00100000 01110011 01101000 01101111 01110010 01110100 00100000 01100110 01101111 01110010 00100000 01100001 00100000 01110011 01110100 01101111 01110010 01101101 00100000 01110100 01110010 01101111 01101111 01110000 01100101 01110010 00111111 00001101 00001010"; 
count=$(echo $dat ^| wc -w); 
run='D2C="'$dat'"; for word in {0..'$count'}; do byte=${D2C:$((word+8*word)):8}; echo -n $(printf '%x' "$((2#$byte))"); done;'; 
echo "$run" | bash | xxd -r -p

在 Ubuntu 16.04.7 上测试

最新更新