¿Herramientas de conversión de ASCII a binario y binario a ASCII?

31

¿Cuál es una buena herramienta para convertir ASCII a binario y binario a ASCII?

Esperaba algo como:

$ 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

O, más realista:

$ 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

Y también al revés:

$ 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

PD: estoy usando bash

PS2: espero no haber obtenido el binario incorrecto

RSFalcon7
fuente
¿Puedes publicar lo que finalmente querrás hacer con esto? Solo b / c, cualquier solución que proporcionemos probablemente solo funcionará para un caso de uso limitado, y tengo la sensación de que pedirá algo que querrá usar de una manera más compleja, y cualquier solución provista probablemente fallará en ese escenario
slm
@slm hecho, edité la pregunta
RSFalcon7
Supongo que desea ignorar la salida de caracteres LF por echo.
Stéphane Chazelas
La mejor manera de entender esto es que todo es binario. Lo que está intentando hacer es producir una cadena ascii de dígitos binarios que represente el binario del mensaje codificado ascii original. Por lo tanto, es irrelevante que el original esté codificado en ascii (bueno, casi siempre que lo sea). Ahora solo necesita una herramienta que pueda imprimir el binario como texto. (ya hay respuesta para decirte cómo).
ctrl-alt-delor

Respuestas:

36
$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
  • -e expressionevaluar la expresión dada como perlcódigo
  • -p: sedmodo. La expresión se evalúa para cada línea de entrada, con el contenido de la línea almacenado en la $_variable e impreso después de la evaluación de la expresión .
  • -l: incluso más como sed: en lugar de la línea completa, solo se encuentra el contenido de la línea (es decir, sin el delimitador de línea) $_(y se agrega una nueva línea en la salida). Entonces perl -lpe codefunciona como sed codeexcepto que es perlcódigo en lugar de sedcódigo.
  • unpack "B*" trabaja en el $_ variable de manera predeterminada y extrae su contenido como una cadena de bits que va del bit más alto del primer byte al bit más bajo del último byte.
  • packhace lo contrario de unpack. Ver perldoc -f packpara más detalles.

Con espacios:

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

(se supone que la entrada está en bloques de 8 bits (con relleno 0)).

Con unpack "(B8)*", extraemos 8 bits a la vez, y unimos las cadenas resultantes con espacios con join " ".

Stéphane Chazelas
fuente
Muchas gracias. Estoy un poco familiarizado con Perl, pero los detalles extendidos serán muy útiles para aquellos completamente nuevos en Perl.
Yokai
23

Puede usar xxdpara convertir desde ASCII y binario.

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

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

Convertir bases

Si está buscando hacer conversiones básicas entre Hex, Octal y Dec, generalmente uso la herramienta de línea de comandos de la calculadora básica ( bc) para hacer esas cosas. Tenga en cuenta que bcsiempre es muy exigente con el orden correcto de las bases: obaseprimero debe especificar la base resultante ( ) y luego agregar su elección ibase.

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

$ echo "obase=16; ibase=2; 1010" | bc
A
slm
fuente
xxdsería bueno, excepto que muestra esa primera columna molesta y la entrada base al final de la línea.
RSFalcon7
@ RSFalcon7: lo sé, puede canalizarlo para awkdeshacerse de él, pero no parece tener interruptores para deshabilitar esta pantalla. | awk '{print $2}'. También hay otras herramientas. od& hexdump. Estoy buscando otro método usando esos.
slm
1
@ RSFalcon7 usa la -popción para obtener una salida 'pura'
Pureferret
Yo uso el xxd -benfoque yo mismo, sin embargo, uno no puede usar xxdsolo para convertir binario de nuevo a ASCII. Entonces, me temo que tendrías que usar algo como printf 'obase=16;ibase=2;%s\n' "$n" | bc | xxd -p -r, con $ n que contiene el número para convertir, ya sea como una larga cadena de dígitos, o una cadena de dígitos separados por punto y coma. Si puede garantizar que $ n encaja en el tipo aritmético de sus proyectiles, entonces puede salirse con la suyaprintf '%x\n' $((2#$n)) | xxd -p -r
Franki
A menos que pueda usar algo como perl / python
Franki
8

Usando bc y 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
fuente
5

Solución de shell para convertir binario a 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
fuente
2
Esta no es una solución pura de concha. sed, try bcson programas externos llamados en el script de shell.
Yokai
4

En python

Para caracteres ASCII en el rango [ -~]en Python 2:

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

En reversa:

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

En Python 3.2+:

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

En reversa:

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

Usando 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'")

Guardado como "bin2ascii", por ejemplo:

$ bin2ascii -a "Hello, world!"
1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001

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

Codificación binaria por base64

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

Decodificación base64

$ echo "VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==" | base64 -d
This is a binary message
Me gusta
fuente