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


31

哪一个将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:我希望我没有得到错误的二进制文件


您可以发布您最终要使用的功能吗?只是b / c我们提供的任何解决方案都可能仅适用于狭窄的用例,并且我认为您会要求以更复杂的方式使用某些东西,并且提供的任何解决方案都可能会失败在那种情况下。
slm

@slm完成后,我编辑了问题
RSFalcon7 2013年

我认为您想忽略的LF字符输出echo
斯特凡Chazelas

理解这一点的最好方法是,一切都是二进制的。您要执行的操作是生成一个二进制数字的ascii字符串,该字符串代表原始ascii编码消息的二进制文件。因此,对原始文件进行ascii编码(几乎可以,只要是这样)就无关紧要。现在,您只需要一个可以将二进制文件打印为文本的工具。(已经有答案告诉您如何操作)。
ctrl-alt-delor

Answers:


36
$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
  • -e expression计算给定表达式作为perl代码
  • -psed模式。将针对输入的每一行评估表达式,并将行的内容存储在$_变量中,并在计算表达式之后将其打印出来。
  • -l:甚至更像sed:而不是完整的行,只有行的内容(即没有行定界符)在其中$_(并且在输出中添加了换行符)。因此,除了它是代码而不是代码之外,其perl -lpe code工作方式类似。sed codeperlsed
  • 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 " "


非常感谢。我对perl有点熟悉,但是扩展的细节将对那些完全不熟悉perl的人很有帮助。
Yokai

23

您可以用于xxd从ASCII和二进制转换。

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

$ echo -n "A" | xxd -b | awk '{print $2}'
01000001

转换基地

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

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

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

xxd会很好,只不过它显示了第一个烦人的列和行末的基本输入。
RSFalcon7 2013年

@ RSFalcon7-我知道,您可以通过管道将其awk删除,但是似乎没有开关来禁用此显示。| awk '{print $2}'。还有其他工具。odhexdump。我正在寻找使用这些的另一种方法。
slm

1
@ RSFalcon7使用该-p选项获得“纯”输出
Pureferret 2014年

xxd -b自己使用这种方法,但是,不能xxd单独使用将二进制转换回ASCII的方法。为此,我担心您将不得不使用,如printf 'obase=16;ibase=2;%s\n' "$n" | bc | xxd -p -r$ n包含要转换的数字,它可以是一长串数字或一串用分号分隔的数字。如果您可以保证$ n适合您的shell的算术类型,那么您可能会printf '%x\n' $((2#$n)) | xxd -p -r
不满意

除非您可以使用perl / python之类的东西
Franki 2014年

8

使用bc和bash:

#!/bin/bash

chrbin() {
        echo $(printf \\$(echo "ibase=2; obase=8; $1" | bc))
}

ordbin() {
  a=$(printf '%d' "'$1")
  echo "obase=2; $a" | bc
}

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

5

Shell解决方案,将二进制转换为ASCII:

bin2ascii() { { tr -cd 01 | fold -w8; echo; } | sed '1i obase=8; ibase=2' | bc | sed 's/^/\\/' | tr -d '\n' | xargs -0 echo -e; }

2
这不是一个纯粹的外壳解决方案。sedtrbc是在shell脚本中调用的外部程序。
Yokai

4

在Python中

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

>>> import binascii
>>> bin(int(binascii.hexlify('hello'), 16))
'0b110100001100101011011000110110001101111'

相反:

>>> n = int('0b110100001100101011011000110110001101111', 2)
>>> binascii.unhexlify('%x' % n)
'hello'

在Python 3.2+中:

>>> bin(int.from_bytes('hello'.encode(), 'big'))
'0b110100001100101011011000110110001101111'

相反:

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

2

使用Python 3:

#!/usr/bin/env python3

import sys


if __name__ == "__main__":
    if len(sys.argv) != 1 and len(sys.argv) <= 3:
        if sys.argv[1] in ('-b', '--binary'):
            n = int(sys.argv[2].replace(' ', ''), 2)
            print(n.to_bytes((n.bit_length() + 7) // 8, 'big').decode())
        if sys.argv[1] in ('-a', '--ascii'):
            print((bin(int.from_bytes(sys.argv[2].encode(), 'big')))[2:])
    else:
        print("Example: decode -b '10000001'")

例如,另存为“ bin2ascii”:

$ bin2ascii -a "Hello, world!"
1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001

$ bin2ascii -b 1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001  
Hello, world!

0

通过base64编码二进制

$ echo "This is a binary message" | base64
VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==

解码base64

$ echo "VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==" | base64 -d
This is a binary message
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.