Outils de conversion ASCII en binaire et binaire en ASCII?

31

Quel est un bon outil pour convertir ASCII en binaire et binaire en ASCII?

J'espérais quelque chose comme:

$ 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

Ou, plus réaliste:

$ 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

Et aussi l'inverse:

$ 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: j'utilise bash

PS2: J'espère que je n'ai pas eu le mauvais binaire

RSFalcon7
la source
Pouvez-vous poster ce que vous allez finalement vouloir faire avec ça? Juste b / c quelles que soient les solutions que nous fournissons ne fonctionneront probablement que pour un cas d'utilisation étroit, et j'ai l'impression que vous demanderez quelque chose que vous voudrez utiliser de manière plus complexe, et toutes les solutions fournies échoueront probablement dans ce scénario.
slm
@slm done, j'ai édité la question
RSFalcon7
Je suppose que vous voulez ignorer la sortie du caractère LF par echo.
Stéphane Chazelas
La meilleure façon de comprendre cela est que tout est binaire. Ce que vous essayez de faire est de produire une chaîne ascii de chiffres binaires qui représente le binaire du message codé ascii d'origine. Par conséquent, il n'est pas pertinent que l'original soit codé en ascii (enfin presque, tant qu'il l'est). Maintenant, vous avez juste besoin d'un outil qui peut imprimer le binaire sous forme de texte. (il y a déjà des réponses pour vous dire comment).
ctrl-alt-delor

Réponses:

36
$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
  • -e expressionévaluer l'expression donnée comme perlcode
  • -p: sedmode. L' expression est évaluée pour chaque ligne d'entrée, le contenu de la ligne étant stocké dans la $_variable et imprimé après l'évaluation de l' expression .
  • -l: encore plus comme sed: au lieu de la ligne complète, seul le contenu de la ligne (c'est-à-dire sans le délimiteur de ligne) est $_dedans (et une nouvelle ligne est rajoutée en sortie). Fonctionne donc perl -lpe codecomme sed codesauf que c'est du perlcode par opposition au sedcode.
  • unpack "B*"travaille sur la $_variable par défaut et extrait son contenu sous la forme d'une chaîne de bits passant du bit le plus élevé du premier octet au bit le plus bas du dernier octet.
  • packfait l'inverse de unpack. Voir perldoc -f packpour plus de détails.

Avec des espaces:

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

(il suppose que l'entrée est en blocs de 8 bits (avec 0 remplissage)).

Avec unpack "(B8)*", nous extrayons 8 bits à la fois, et nous joignons les chaînes résultantes avec des espaces avec join " ".

Stéphane Chazelas
la source
Merci beaucoup. Je suis un peu familier avec perl mais les détails étendus seront très utiles à ceux complètement nouveaux à perl.
Yokai
23

Vous pouvez utiliser xxdpour convertir en ASCII et binaire.

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

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

Conversion de bases

Si vous cherchez à faire uniquement des conversions de base entre Hex, Octal et Dec, j'utilise généralement l'outil de ligne de commande de la calculatrice de base ( bc) pour faire de telles choses. Notez que bcc'est toujours très pointilleux sur l'ordre correct des bases: vous devez d'abord spécifier la base résultante ( obase), puis ajouter votre choix de ibase.

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

$ echo "obase=16; ibase=2; 1010" | bc
A
slm
la source
xxdserait bien, sauf qu'il montre cette première colonne ennuyeuse et l'entrée de base à la fin de la ligne.
RSFalcon7
@ RSFalcon7 - Je sais, vous pouvez le diriger awkpour vous en débarrasser, mais il ne semble pas avoir de commutateurs pour désactiver cet affichage. | awk '{print $2}'. Il existe également d'autres outils. od& hexdump. Je cherche une autre méthode en utilisant ceux-ci.
slm
1
@ RSFalcon7 utilise l' -poption pour obtenir une sortie "pure"
Pureferret
J'utilise l' xxd -bapproche moi-même, cependant, on ne peut pas utiliser xxdseul pour reconvertir le binaire en ASCII. Pour le moment, je crains que vous ne deviez utiliser quelque chose comme printf 'obase=16;ibase=2;%s\n' "$n" | bc | xxd -p -r, avec $ n contenant le nombre à convertir, soit comme une longue chaîne de chiffres, soit comme une chaîne de chiffres séparés par des points-virgules. Si vous pouvez garantir que $ n rentre dans le type arithmétique de vos coquilles, alors vous pouvez vous en sortir avecprintf '%x\n' $((2#$n)) | xxd -p -r
Franki
Sauf si vous pouvez utiliser quelque chose comme perl / python
Franki
8

Utilisation de bc et 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
la source
5

Solution de shell pour convertir le binaire en 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
la source
2
Ce n'est pas une pure solution shell. sed,, tret bcsont des programmes externes appelés dans le script shell.
Yokai
4

En Python

Pour les caractères ASCII de la plage [ -~]sur Python 2:

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

En marche arrière:

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

En Python 3.2+:

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

En marche arrière:

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

Utilisation de 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'")

Enregistré comme "bin2ascii" par exemple:

$ bin2ascii -a "Hello, world!"
1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001

$ bin2ascii -b 1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001  
Hello, world!
Vishtar
la source
0

Encodage binaire par base64

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

Base de décodage64

$ echo "VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==" | base64 -d
This is a binary message
Comme
la source