ASCII to Binary 和 Binary to ASCII 转换工具?

RSF*_*on7 42 bash ascii binary

哪个是将 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
Run Code Online (Sandbox Code Playgroud)

或者,更现实的:

$ 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
Run Code Online (Sandbox Code Playgroud)

还有相反的:

$ 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
Run Code Online (Sandbox Code Playgroud)

PS:我正在使用 bash

PS2:我希望我没有得到错误的二进制文件

Sté*_*las 47

$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
Run Code Online (Sandbox Code Playgroud)
  • -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
Run Code Online (Sandbox Code Playgroud)

(它假设输入是 8 位块(0 填充))。

使用unpack "(B8)*",我们一次提取 8 位,然后用 将结果字符串与空格连接起来join " "


slm*_*slm 35

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

$ echo -n "A" | xxd -b
0000000: 01000001                                               A

$ echo -n "A" | xxd -b | awk '{print $2}'
01000001
Run Code Online (Sandbox Code Playgroud)

转换碱基

如果您只想在十六进制、八进制和十二进制之间进行基本转换,我通常会使用基本的计算器命令行工具 ( bc) 来执行此类操作。请注意,bc对于碱基的正确顺序总是非常挑剔:您必须首先指定结果碱基 ( obase),然后添加您选择的ibase.

$ echo "obase=2; ibase=16; A" | bc
1010

$ echo "obase=16; ibase=2; 1010" | bc
A
Run Code Online (Sandbox Code Playgroud)


Fre*_*rdt 12

使用 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
Run Code Online (Sandbox Code Playgroud)


n.c*_*lou 6

将二进制转换为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; }
Run Code Online (Sandbox Code Playgroud)

  • 这不是纯 shell 解决方案。`sed`、`tr` 和 `bc` 是在 shell 脚本中调用的外部程序。 (3认同)

ser*_*inc 5

在 Python 中

对于[ -~]Python 2范围内的 ASCII 字符:

>>> import binascii
>>> bin(int(binascii.hexlify('hello'), 16))
'0b110100001100101011011000110110001101111'
Run Code Online (Sandbox Code Playgroud)

相反:

>>> n = int('0b110100001100101011011000110110001101111', 2)
>>> binascii.unhexlify('%x' % n)
'hello'
Run Code Online (Sandbox Code Playgroud)

在 Python 3.2+ 中:

>>> bin(int.from_bytes('hello'.encode(), 'big'))
'0b110100001100101011011000110110001101111'
Run Code Online (Sandbox Code Playgroud)

相反:

>>> n = int('0b110100001100101011011000110110001101111', 2)
>>> n.to_bytes((n.bit_length() + 7) // 8, 'big').decode()
'hello'
Run Code Online (Sandbox Code Playgroud)