Hoy vamos a ver cómo desarrollar el algoritmo para convertir binario a texto en C también conocido como ANSI C; es decir, haremos un traductor o convertidor binario a texto.
Recuerda que en posts anteriores vimos cómo hacer lo contrario, es decir, convertir texto a binario.
Las funciones que vamos a ver son strtok y la función que hicimos para convertir un número binario a uno decimal en ANSI C.
Traductor binario a texto en C
El algoritmo es realmente sencillo. Vamos a tener una cadena que va a representar el binario (puedes leerla del usuario con fgets), pueden ser varios octetos; separados por un espacio. Por ejemplo:
01001101 01101001 00100000 01101110 01101111 01101101 01100010 01110010 01100101 00100000 01100101 01110011 00100000 01001100 01110101 01101001 01110011 00100000 01000011 01100001 01100010 01110010 01100101 01110010 01100001 00100000 01000010 01100101 01101110 01101001 01110100 01101111
Después vamos a separar cada octeto con el espacio como delimitador, usando strtok; obteniendo un octeto a la vez (es decir, 8 bits, el carácter en binario)
Cuando tengamos el octeto, convertimos el binario a decimal, lo que nos dará el código ASCII, que fácilmente podemos convertir a char
.
Una vez que tenemos el char
, podemos imprimirlo directamente o guardarlo en una variable; yo haré lo primero.
Hablar es de mal gusto, muéstrame el código
Así que vamos a ver el código de conversión de binario a texto en C. Definimos algunas variables, entre ellas el delimitador. También imprimimos el texto original, es decir, en binario:
// El binario que vamos a traducir
char textoBinario[] = "01001101 01101001 00100000 01101110 01101111 01101101 01100010 01110010 01100101 00100000 01100101 01110011 00100000 01001100 01110101 01101001 01110011 00100000 01000011 01100001 01100010 01110010 01100101 01110010 01100001 00100000 01000010 01100101 01101110 01101001 01110100 01101111";
printf("En binario es: \n%s\n", textoBinario);
char delimitador[] = " "; // Para separar cada octeto
Ahora separamos la cadena por espacios con strtok
:
// Separar cadena por espacios. https://parzibyte.me/blog/2018/11/13/separar-cadena-delimitadores-c-strtok/
char *octeto = strtok(textoBinario, delimitador);
printf("En texto es: \n");
while (octeto != NULL) {
// Magia aquí
octeto = strtok(NULL, delimitador);
}
Si no entiendes bien cómo funciona strtok
mira esto. Necesitamos la función que convierte:
// Inspirado en
//https://parzibyte.me/blog/2018/11/19/convertir-binario-decimal-c/
int binarioADecimal(char *cadenaBinaria, int longitud) {
int decimal = 0;
int multiplicador = 1;
char caracterActual;
for (int i = longitud - 1; i >= 0; i--) {
caracterActual = cadenaBinaria[i];
if (caracterActual == '1') {
decimal += multiplicador;
}
multiplicador = multiplicador * 2;
}
return decimal;
}
Finalmente, dentro del ciclo while
de strtok
convertimos e imprimimos:
char letra = (char) binarioADecimal(octeto, (int) strlen(octeto));
printf("%c", letra);
Poniendo todo junto
El código completo se ve así:
/**
* Traductor de binario a texto (binario a español) en C
* @date 2019-12-18
* @author parzibyte
* @see https://parzibyte.me/blog
* */
#include <stdio.h>
#include <string.h>
// Inspirado en
//https://parzibyte.me/blog/2018/11/19/convertir-binario-decimal-c/
int binarioADecimal(char *cadenaBinaria, int longitud) {
int decimal = 0;
int multiplicador = 1;
char caracterActual;
for (int i = longitud - 1; i >= 0; i--) {
caracterActual = cadenaBinaria[i];
if (caracterActual == '1') {
decimal += multiplicador;
}
multiplicador = multiplicador * 2;
}
return decimal;
}
int main(void) {
// El binario que vamos a traducir
char textoBinario[] = "01001101 01101001 00100000 01101110 01101111 01101101 01100010 01110010 01100101 00100000 01100101 01110011 00100000 01001100 01110101 01101001 01110011 00100000 01000011 01100001 01100010 01110010 01100101 01110010 01100001 00100000 01000010 01100101 01101110 01101001 01110100 01101111";
printf("En binario es: \n%s\n", textoBinario);
char delimitador[] = " "; // Para separar cada octeto
// Separar cadena por espacios. https://parzibyte.me/blog/2018/11/13/separar-cadena-delimitadores-c-strtok/
char *octeto = strtok(textoBinario, delimitador);
printf("En texto es: \n");
while (octeto != NULL) {
char letra = (char) binarioADecimal(octeto, (int) strlen(octeto));
printf("%c", letra);
octeto = strtok(NULL, delimitador);
}
return 0;
}
Si lo ejecuto con la cadena que mostré al inicio, aparece:
Te dejo dos enlaces interesantes. Si quieres ver el traductor de texto a binario, haz click aquí.
En caso de que quieras aprender más sobre C haz click aquí.
He intentado mucho sobre como leer el mensaje o texto binario hacia el usuario con el fgets la cual no termino de comprender como es posible leer o guardar ese dato del usuario mediante cual variable debo asignar para almacenarlo en el fgets
me seria de mucha ayuda alguna solución a esta.
Hola. Gracias por sus comentarios. Si tiene alguna consulta, solicitud de creación de un programa o solicitud de cambio de software estoy para servirle en https://parzibyte.me/#contacto
Saludos!