Resumen: mostrar cómo convertir texto (oraciones, palabras, letras) a su representación binaria en C (usando ceros y unos). Es decir, hacer un traductor de texto a binario en ANSI C.
Por ejemplo, convertir Mi nombre es Luis Cabrera Benito en 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 0110100
Te aviso de una vez que voy a usar la función itoa y el método para rellenar cadenas; pues itoa
no regresará números binarios de 8 dígitos (ya que los ceros a la izquierda no cuentan, pero para el traductor son importantes).
Comencemos…
Nota: si quieres ver el proceso inverso (binario a texto) mira este post.
Primero debemos obtener el texto que vamos a recorrer, que será una cadena al final. Esta cadena la puedes leer del usuario con fgets o simplemente definirla; yo haré lo segundo:
// El texto que vamos a traducir
char *texto = "Mi nombre es Luis Cabrera Benito";
Ahora recorremos letra por letra y dentro de cada iteración, vamos a convertir el valor del carácter en su representación ASCII o valor ASCII (char a int).
Por ejemplo, el @
se convierte en 64
y así según las equivalencias.
int decimal = 0;
int i = 0;
while (texto[i] != '\0') {
decimal = (long) texto[i];// Obtener valor ASCII del carácter
// Magia aquí
i++;
}
Antes del ciclo, debemos definir una cadena que servirá para guardar el texto en binario de cada carácter; debe ser de al menos 8 dígitos agregando además el carácter nulo:
char cadena[9];
Y dentro del ciclo invocamos a itoa
que pondrá el resultado dentro de cadena
. Después de eso, rellenamos la cadena con ceros a la izquierda y vamos imprimiendo hasta terminar de recorrer la cadena.
El ciclo while
queda así:
while (texto[i] != '\0') {
decimal = (long) texto[i];// Obtener valor ASCII del carácter
// Convertir y almacenar el binario en "cadena"
itoa(decimal, cadena, 2);
// Diferencia para saber si no mide 8
int diferencia = 8 - (int) strlen(cadena);
// Imprimir. El %*.*s es para rellenar la cadena con ceros a la izquierda
// https://stackoverflow.com/questions/276827/string-padding-in-c/9741091#9741091
printf("%*.*s%s ", diferencia, diferencia, relleno, cadena);
i++;
}
Como puedes notar, la conversión a base 2 se hace en la línea 4. Una vez que eso se ha hecho, cadena tiene el número binario, pero la rellenamos con N
caracteres (en donde N
es la diferencia, línea 6)
Finalmente la imprimimos y así queda completo.
Así que el código completo del traductor de texto a binario en C queda así:
/**
* Traductor de texto a binario en ANSI C
*
* @author parzibyte
* @see https://parzibyte.me/blog
* */#include <stdio.h>
#include <string.h>
/**
* C++ version 0.4 char* style "itoa":
* Written by Lukás Chmela
* Released under GPLv3.
*/char *itoa(int value, char *result, int base) {
// check that the base if valid
if (base < 2 || base > 36) {
*result = '\0';
return result;
}
char *ptr = result, *ptr1 = result, tmp_char;
int tmp_value;
do {
tmp_value = value;
value /= base;
*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 +
(tmp_value - value * base)];
} while (value);
// Apply negative sign
if (tmp_value < 0) *ptr++ = '-';
*ptr-- = '\0';
while (ptr1 < ptr) {
tmp_char = *ptr;
*ptr-- = *ptr1;
*ptr1++ = tmp_char;
}
return result;
}
int main(void) {
// El texto que vamos a traducir
char *texto = "Mi nombre es Luis Cabrera Benito";
printf("En texto es: %s\n", texto);
char *relleno = "00000000";
// El número que irá tomando cada letra
int decimal = 0;
char cadena[9];
int i = 0;
printf("En binario es: \n");
while (texto[i] != '\0') {
decimal = (long) texto[i];// Obtener valor ASCII del carácter
// Convertir y almacenar el binario en "cadena"
itoa(decimal, cadena, 2);
// Diferencia para saber si no mide 8
int diferencia = 8 - (int) strlen(cadena);
// Imprimir. El %*.*s es para rellenar la cadena con ceros a la izquierda
// https://stackoverflow.com/questions/276827/string-padding-in-c/9741091#9741091
printf("%*.*s%s ", diferencia, diferencia, relleno, cadena);
i++;
}
}
Recuerda que la función itoa
la defino porque en Linux no está presente. La salida al ejecutarlo al menos con el texto mostrado es:
Si quieres probar que funciona, puedes usar este traductor que programé yo.
Si quieres más sobre C de mi blog haz click aquí.
Actualización: aquí puedes ver cómo convertir binario a texto en ANSI C.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.
Ver comentarios
Y si en caso quisiera ingresar un texto cualquiera? no habría alguna forma de modificar el código para tener datos de entrada y salida?
Podrías poner el código con ese añadido, de que se pueda ingresar datos en la interfaz del programa, por favor, intento y no me sale.
Hola. Si tiene alguna solicitud puede hacérmela llegar en https://parzibyte.me/#contacto
Saludos!
Sí, es posible