ASCII 到二进制和二进制到 ASCII 转换工具?

ASCII 到二进制和二进制到 ASCII 转换工具?

哪个工具可以将 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代码
  • -psed模式。这表达对输入的每一行进行评估,该行的内容存储在变量中$_并在评估后打印表达
  • -l:甚至更像sed:而不是整行,只有内容该行的(即没有行分隔符)位于$_(并且在输出中添加回换行符)。所以perl -lpe code工作原理是一样的sed code,只不过它是perl代码而不是sed代码。
  • unpack "B*"默认情况下对$_变量进行处理,并将其内容提取为从第一个字节的最高位到最后一个字节的最低位的位字符串。
  • pack做相反的事情unpackperldoc -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

您可以使用xxdASCII 和二进制进行转换。

$ 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; }

相关内容