哪个工具可以将 ASCII 转换为二进制,以及将二进制转换为 ASCII?
我希望有这样的事情:
$ echo --binary "This is a binary message"
01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101
或者,更现实一点:
$ echo "This is a binary message" | ascii2bin
01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101
还有相反的情况:
$ echo "01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101" | bin2ascii
This is a binary message
PS:我用的是bash
PS2:我希望我没有得到错误的二进制文件
答案1
$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
-e expression
将给定表达式计算为perl
代码-p
:sed
模式。这表达对输入的每一行进行评估,该行的内容存储在变量中$_
并在评估后打印表达。-l
:甚至更像sed
:而不是整行,只有内容该行的(即没有行分隔符)位于$_
(并且在输出中添加回换行符)。所以perl -lpe code
工作原理是一样的sed code
,只不过它是perl
代码而不是sed
代码。unpack "B*"
默认情况下对$_
变量进行处理,并将其内容提取为从第一个字节的最高位到最后一个字节的最低位的位字符串。pack
做相反的事情unpack
。perldoc -f pack
详情请参阅。
带空格:
$ echo AB | perl -lpe '$_=join " ", unpack"(B8)*"'
01000001 01000010
$ echo 01000001 01000010 | perl -lape '$_=pack"(B8)*",@F'
AB
(假设输入是 8 位块(0 填充))。
使用unpack "(B8)*"
,我们一次提取 8 位,并将结果字符串与空格连接起来join " "
。
答案2
您可以使用xxd
ASCII 和二进制进行转换。
$ echo -n "A" | xxd -b
0000000: 01000001 A
$ echo -n "A" | xxd -b | awk '{print $2}'
01000001
转换碱基
如果您只想在十六进制、八进制和十进制之间进行基本转换,我通常使用基本计算器命令行工具 ( bc
) 来完成此类操作。请注意,bc
对于碱基的正确顺序总是非常挑剔:您必须obase
首先指定结果碱基 ( ),然后添加您的选择ibase
。
$ echo "obase=2; ibase=16; A" | bc
1010
$ echo "obase=16; ibase=2; 1010" | bc
A
答案3
使用 bc 和 bash:
#!/bin/bash
chrbin() {
echo $(printf \\$(echo "ibase=2; obase=8; $1" | bc))
}
ordbin() {
a=$(printf '%d' "'$1")
b=$(echo "obase=2; $a" | bc)
printf '%08d' $b
}
ascii2bin() {
echo -n $* | while IFS= read -r -n1 char
do
ordbin $char | tr -d '\n'
echo -n " "
done
}
bin2ascii() {
for bin in $*
do
chrbin $bin | tr -d '\n'
done
}
ascii2bin "This is a binary message"
bin2ascii 01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101
答案4
将二进制转换为ascii的Shell解决方案:
bin2ascii() { { tr -cd 01 | fold -w8; echo; } | sed '1i obase=8; ibase=2' | bc | sed 's/^/\\/' | tr -d '\n' | xargs -0 echo -e; }