En este post de programación en Python te mostraré un traductor de binario a texto y de texto a binario. Es decir, codificar de texto plano a binario, y de binario a texto plano.
Con esto podremos codificar y decodificar mensajes, ya sea proporcionando el texto plano para convertirlo a ceros y unos, o proporcionando la cadena de ceros y unos para transformarlo a texto plano.
Al terminar vamos a tener un traductor en Python capaz de traducir la cadena (por ejemplo) 01010000 01100001 01110010 01111010 01101001 01100010 01111001 01110100 01100101
en Parzibyte
.
Algoritmo general
Primero veamos cómo convertir de texto a binario en Python. Una vez que tengamos el texto, lo recorremos letra por letra. Ahora obtenemos el valor ASCII de la letra, por ejemplo, para la letra A
el valor es 65
.
Una vez que tenemos el código ASCII de la letra como entero decimal, lo convertimos a binario. Esta conversión puede ser usando funciones nativas o métodos manuales.
Cuando tengamos el número binario, lo concatenamos al resultado (junto con un espacio o un separador). Y hacemos eso por cada letra.
Para el caso de convertir de binario a texto primero debemos convertir el texto codificado a un arreglo para tener cada letra codificada por separado (ahí el uso del separador). Después convertimos el binario a decimal y luego convertimos el ASCII obtenido al carácter correspondiente.
Finalmente vamos agregando ese carácter (ya sea una letra o un espacio) a la cadena del resultado.
Esto puede parecer muy complejo pero verás que será realmente fácil, ya que vamos a separar todo en funciones para tener un código ordenado y limpio.
Texto a binario en Python
Comencemos viendo cómo codificar el texto. Primero tenemos la función que convierte un carácter a su representación binaria:
def ascii_a_binario(letra):
# Extraer su valor entero
valor = ord(letra)
# Convertirlo a binario
return "{0:08b}".format(valor)
Estamos formateando las cadenas para que el binario resultante tenga ceros a la izquierda. Y luego invocamos a esa función desde la que codifica el texto completo:
def texto_a_binario(texto):
texto_binario = "" # El resultado
contador = 0
for letra in texto:
texto_binario += ascii_a_binario(letra)
# Agregar un espacio entre binarios, excepto si es el último carácter
if contador + 1 < len(texto):
texto_binario += separador
contador += 1
return texto_binario
De este modo llegamos a la mitad de este tutorial. Ahora vamos a ver la segunda parte que es decodificar, o mejor dicho, convertir el binario a texto plano.
Binario a texto
Ya expliqué anteriormente el algoritmo así que vamos directo al código fuente. Primero veamos cómo convertir un binario a su carácter correspondiente:
def binario_a_ascii(binario):
# Convertir binario a decimal
valor = int(binario, 2)
# Convertir el decimal a su representación ASCII
return chr(valor)
Después invocamos a esa función por cada binario que haya en la cadena codificada:
def binario_a_texto(texto_binario):
texto_plano = ""
for binario in texto_binario.split(separador):
texto_plano += binario_a_ascii(binario)
return texto_plan
Modo de uso
Ahora te enseñaré cómo usar el traductor con un sencillo ejemplo:
"""
Modo de uso
"""
texto_original = "Parzibyte"
texto_codificado = texto_a_binario(texto_original)
print(f"El texto '{texto_original}' es '{texto_codificado}' en binario")
# Decodificar
original = binario_a_texto(texto_codificado)
print(f"El texto binario '{texto_codificado}' es '{original}'")
La salida la puedes ver en la imagen anterior. Obviamente este código puede venir de cualquier lugar… venir de un archivo, de lo que el usuario escriba, de una petición http, etcétera.
Poniendo todo junto
Hemos visto las dos partes de este traductor binario a texto; vimos cómo codificar y cómo decodificar. Es momento de mostrarte el código completo, mismo que queda así:
"""
____ _____ _ _ _
| _ \ | __ \ (_) | | |
| |_) |_ _ | |__) |_ _ _ __ _____| |__ _ _| |_ ___
| _ <| | | | | ___/ _` | '__|_ / | '_ \| | | | __/ _ \
| |_) | |_| | | | | (_| | | / /| | |_) | |_| | || __/
|____/ \__, | |_| \__,_|_| /___|_|_.__/ \__, |\__\___|
__/ | __/ |
|___/ |___/
____________________________________
/ Si necesitas ayuda, contáctame en \
\ https://parzibyte.me /
------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Creado por Parzibyte (https://parzibyte.me).
------------------------------------------------------------------------------------------------
| IMPORTANTE |
Si vas a borrar este encabezado, considera:
Seguirme: https://parzibyte.me/blog/sigueme/
Y compartir mi blog con tus amigos
También tengo canal de YouTube: https://www.youtube.com/channel/UCroP4BTWjfM0CkGB6AFUoBg?sub_confirmation=1
Twitter: https://twitter.com/parzibyte
Facebook: https://facebook.com/parzibyte.fanpage
Instagram: https://instagram.com/parzibyte
Hacer una donación vía PayPal: https://paypal.me/LuisCabreraBenito
------------------------------------------------------------------------------------------------
"""
separador = " " # Necesitamos un separador para cuando decodifiquemos esto
def ascii_a_binario(letra):
# Extraer su valor entero
valor = ord(letra)
# Convertirlo a binario
return "{0:08b}".format(valor)
def binario_a_ascii(binario):
# Convertir binario a decimal
valor = int(binario, 2)
# Convertir el decimal a su representación ASCII
return chr(valor)
def texto_a_binario(texto):
texto_binario = "" # El resultado
contador = 0
for letra in texto:
texto_binario += ascii_a_binario(letra)
# Agregar un espacio entre binarios, excepto si es el último carácter
if contador + 1 < len(texto):
texto_binario += separador
contador += 1
return texto_binario
def binario_a_texto(texto_binario):
texto_plano = ""
for binario in texto_binario.split(separador):
texto_plano += binario_a_ascii(binario)
return texto_plano
"""
Modo de uso
"""
texto_original = "Parzibyte"
texto_codificado = texto_a_binario(texto_original)
print(f"El texto '{texto_original}' es '{texto_codificado}' en binario")
# Decodificar
original = binario_a_texto(texto_codificado)
print(f"El texto binario '{texto_codificado}' es '{original}'")
Para terminar, te dejo con más tutoriales de Python.