web-dev-qa-db-fra.com

ASCII en binaire et binaire en ASCII outils de conversion?

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 obtenu le mauvais binaire

33
RSFalcon7
$ echo AB | Perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | Perl -lpe '$_=pack"B*",$_'
AB
  • -e expression Évalue l'expression donnée comme Perl code
  • -p: sed mode. Le expression est évalué pour chaque ligne d'entrée, le contenu de la ligne étant stocké dans la variable $_ Et imprimé après l'évaluation du expression.
  • -l: Encore plus comme sed: au lieu de la ligne complète, seul le conten de la ligne (c'est-à-dire sans le délimiteur de ligne) est dans $_ (Et une nouvelle ligne est ajoutée à la sortie). Ainsi, Perl -lpe code Fonctionne comme sed code Sauf que c'est du code Perl par opposition au code sed.
  • unpack "B*" Fonctionne par défaut sur la variable $_ Et extrait son contenu sous la forme d'une chaîne de bits allant du bit le plus élevé du premier octet au bit le plus bas du dernier octet.
  • pack fait l'inverse de unpack. Voir perldoc -f pack Pour 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 " ".

37

Vous pouvez utiliser xxd pour convertir à partir de 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 bc est toujours très pointilleux sur l'ordre correct des bases: vous devez d'abord spécifier la base résultante (obase), puis ajoutez votre choix de ibase.

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

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

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
8

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; }
5
n.caillou

En Python

Pour ASCII caractères dans la plage [ -~] on Python 2:

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

En marche arrière:

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

Dans 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'
4
serv-inc

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!
2
Vishtar

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
0
Like