Tools zur Konvertierung von ASCII in Binär und Binär in ASCII?

31

Was ist ein gutes Werkzeug, um ASCII in Binär und Binär in ASCII zu konvertieren?

Ich hatte gehofft auf etwas wie:

$ 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

Oder realistischer:

$ 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

Und auch das Gegenteil:

$ 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: Ich benutze Bash

PS2: Ich hoffe, ich habe nicht die falsche Binärdatei bekommen

RSFalcon7
quelle
Kannst du posten, was du letztendlich damit machen willst? Nur b / c, welche Lösungen wir anbieten, funktionieren wahrscheinlich nur für einen engen Anwendungsfall, und ich habe das Gefühl, dass Sie nach etwas fragen, das Sie auf komplexere Weise verwenden möchten, und alle angebotenen Lösungen werden wahrscheinlich scheitern in diesem Szenario.
slm
@slm fertig, ich habe die Frage bearbeitet
RSFalcon7
Ich nehme an, Sie möchten das LF-Zeichen, das von ausgegeben wird, ignorieren echo.
Stéphane Chazelas
Der beste Weg, dies zu verstehen, ist, dass alles binär ist. Sie versuchen, eine ASCII-Zeichenfolge von Binärziffern zu erzeugen, die die Binärzahl der ursprünglichen ASCII-codierten Nachricht darstellt. Daher ist es unerheblich, dass das Original ascii-codiert ist (na ja, fast, solange es ist). Jetzt brauchen Sie nur noch ein Tool, mit dem Sie die Binärdatei als Text drucken können. (es gibt schon antworten wie).
Strg-Alt-Delor

Antworten:

36
$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
  • -e expressionwerten Sie den angegebenen Ausdruck als perlCode aus
  • -p: sedmode. Der Ausdruck wird für jede Eingabezeile ausgewertet, wobei der Inhalt der Zeile in der $_Variablen gespeichert und nach der Auswertung des Ausdrucks gedruckt wird .
  • -l: noch mehr wie sed: Anstelle der vollständigen Zeile befindet sich nur der Inhalt der Zeile ( $_dh ohne Zeilentrennzeichen) in (und eine neue Zeile wird bei der Ausgabe wieder hinzugefügt). Das perl -lpe codefunktioniert so, sed codenur dass es sich um perlCode im Gegensatz zu sedCode handelt.
  • unpack "B*"$_Arbeitet standardmäßig mit der Variablen und extrahiert ihren Inhalt als Bitfolge, die vom höchsten Bit des ersten Bytes zum niedrigsten Bit des letzten Bytes wandert.
  • packmacht das Gegenteil von unpack. Siehe perldoc -f packfür weitere Einzelheiten.

Mit Leerzeichen:

$ echo AB | perl -lpe '$_=join " ", unpack"(B8)*"'
01000001 01000010
$ echo 01000001 01000010 | perl -lape '$_=pack"(B8)*",@F'
AB

(Es wird davon ausgegangen, dass die Eingabe in 8-Bit-Blöcken (0-gepolstert) erfolgt.)

Mit unpack "(B8)*"extrahieren wir jeweils 8 Bits und verbinden die resultierenden Zeichenfolgen mit Leerzeichen join " ".

Stéphane Chazelas
quelle
Danke vielmals. Ich bin mit Perl einigermaßen vertraut, aber die erweiterten Details sind für Perl-Neulinge sehr hilfreich.
Yokai
23

Sie können xxdzum Konvertieren von ASCII und Binär verwenden.

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

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

Basen umwandeln

Wenn Sie nur Grundkonvertierungen zwischen Hex, Oktal und Dez vornehmen möchten, verwende ich normalerweise das grundlegende Befehlszeilentool ( bc) des Taschenrechners , um solche Dinge zu tun. Beachten Sie, dass bcdie richtige Reihenfolge der Basen immer sehr wählerisch ist: Sie müssen zuerst die resultierende Base ( obase) angeben und dann Ihre Auswahl von hinzufügen ibase.

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

$ echo "obase=16; ibase=2; 1010" | bc
A
slm
quelle
xxdwäre nett, außer es zeigt die erste nervige spalte und die basiseingabe am ende der zeile.
RSFalcon7
@ RSFalcon7 - Ich weiß, Sie können es weiterleiten awk, um es loszuwerden, aber es scheint keine Schalter zu haben, um diese Anzeige zu deaktivieren. | awk '{print $2}'. Es gibt auch andere Werkzeuge. od& hexdump. Ich suche nach einer anderen Methode, die diese verwendet.
slm
1
@ RSFalcon7 benutze die -pOption, um 'reine' Ausgabe zu erhalten
Pureferret
Ich selbst verwende den xxd -bAnsatz, den man jedoch nicht xxdalleine verwenden kann, um Binärdaten wieder in ASCII umzuwandeln. Daher fürchte ich, Sie müssten so etwas wie verwenden printf 'obase=16;ibase=2;%s\n' "$n" | bc | xxd -p -r, wobei $ n die zu konvertierende Zahl entweder als lange Ziffernfolge oder als durch Semikolons getrennte Ziffernfolge enthält. Wenn Sie garantieren können, dass $ n in den arithmetischen Typ Ihrer Muscheln passt, können Sie mitprintf '%x\n' $((2#$n)) | xxd -p -r
Franki
Es sei denn, Sie können etwas wie Perl / Python verwenden
Franki
8

Mit bc und 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
Frederik Deweerdt
quelle
5

Shell-Lösung zum Konvertieren von Binär in ASCII:

bin2ascii() { { tr -cd 01 | fold -w8; echo; } | sed '1i obase=8; ibase=2' | bc | sed 's/^/\\/' | tr -d '\n' | xargs -0 echo -e; }
n.caillou
quelle
2
Dies ist keine reine Schalenlösung. sed,, trund bcsind externe Programme, die im Shell-Skript aufgerufen werden.
Yokai
4

In Python

Für ASCII-Zeichen im Bereich [ -~]von Python 2:

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

Rückwärts:

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

In Python 3.2+:

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

Rückwärts:

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

Verwendung von 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'")

Gespeichert als "bin2ascii" zum Beispiel:

$ bin2ascii -a "Hello, world!"
1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001

$ bin2ascii -b 1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001  
Hello, world!
Vishtar
quelle
0

Kodierung von Binärdateien durch base64

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

Base64 entschlüsseln

$ echo "VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==" | base64 -d
This is a binary message
Mögen
quelle