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.
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.
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);
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í.
El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…
En este post te voy a enseñar a designar una carpeta para imprimir todos los…
En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…
Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…
Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…
Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…
Esta web usa cookies.
Ver comentarios
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!