Lenguaje de programación C

Binario a texto en C – Traductor binario a español

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:

Binario a texto en C – Demostración de traductor

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í.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

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.

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.