En esta entrada sobre Java te voy a enseñar a convertir texto a binario, y binario a texto. Es decir, hacer un tipo de Traductor texto – binario en Java para poder convertir entre ambos formatos.
Otra forma de llamar a esto es decir “Traductor binario a español” por ejemplo.
Por ejemplo, convertir 1110000 1100001 1110010 1111010 1101001 1100010 1111001 1110100 1100101 101110 1101101 1100101 a “parzibyte.me” y viceversa.
Todo esto programado en Java con métodos manuales.
Convertir texto a binario: algoritmo
El algoritmo es sencillo. Tenemos el texto en español como una cadena. Extraemos cada letra, y por cada una obtenemos su valor ASCII.
Después de tener su valor ASCII como entero, lo convertimos a binario. Y una vez que lo tenemos como binario, lo vamos almacenando en una cadena que será el resultado. En esta cadena agregamos los valores binarios separándolos por un espacio.
De binario a texto
El procedimiento es casi inverso al anterior, pero con la diferencia de que ahora vamos a usar split
. Tenemos la cadena binaria (cada número binario representa un carácter) separada por espacios.
Obtenemos cada número binario de manera separada con split. Lo que hace split es separar una cadena y convertirla a arreglo. Luego recorremos el arreglo, convertimos el binario a entero (que tendrá la representación ASCII) y obtenemos el carácter que representa.
Funciones de conversión
Para la conversión de números, los métodos que convierten un número binario a decimal, y uno decimal a binario, son:
public static int binaryToDecimal(String binary) {
// A este número le vamos a sumar cada valor binario
int decimal = 0;
int position = 0;
// Recorrer la cadena...
for (int x = binary.length() - 1; x >= 0; x--) {
// Saber si es 1 o 0; primero asumimos que es 1 y abajo comprobamos
short digit = 1;
if (binary.charAt(x) == '0') {
digit = 0;
}
/*
Se multiplica el dígito por 2 elevado a la potencia
según la posición; comenzando en 0, luego 1 y así
sucesivamente
*/
double multiplier = Math.pow(2, position);
decimal += digit * multiplier;
position++;
}
return decimal;
}
public static String decimalToBinary(int decimal) {
if (decimal <= 0) {
return "0";
}
String binary = "";
while (decimal > 0) {
short remainder = (short) (decimal % 2);
decimal = decimal / 2;
// Insertar el dígito al inicio de la cadena
binary = String.valueOf(remainder) + binary;
}
return binary;
}
Convertir texto a binario
Veamos el primer caso entonces para convertir el texto a binario. Es una función que recibe la cadena, la recorre, convierte cada letra y la agrega al resultado:
public static String textToBinary(String originalText) {
String binaryText = "";
for (int i = 0; i < originalText.length(); i++) {
// Primero obtenemos la letra o carácter actual
char currentChar = originalText.charAt(i);
// Necesitamos obtener su representación entera ASCII
int ascii = (int) currentChar;
// Una vez que ya tenemos el entero, lo convertimos a binario
String binary = decimalToBinary(ascii);
// Lo agregamos a la cadena resultante agregando además un espacio
binaryText += binary + " ";
}
// Finalmente regresamos el texto
return binaryText;
}
Lo que la función devuelve es igualmente una cadena con el texto binario. Con esto conseguimos traducir de string a binario, es decir, a ceros y unos.
Binario a texto
Para el proceso inverso igualmente tenemos otra función:
public static String binaryToText(String binaryText) {
// Necesitamos separar cada número binario por espacio. Usamos split
String[] binaryNumbers = binaryText.split(" ");
String text = "";
// Los recorremos. En cada paso tenemos al número binario
for (String currentBinary : binaryNumbers) {
// Ahora convertimos ese binario a decimal
int decimal = binaryToDecimal(currentBinary);
// Obtenemos la letra que le corresponde a ese valor ASCII
char letra = (char) decimal;
text += letra;
}
return text;
}
Lo que mencionaba sobre split está en la línea 3. Lo convertimos a arreglo, recorremos cada valor binario, y lo vamos convirtiendo a decimal para obtener su representación ASCII.
Probando el traductor
Para probar todo esto se pueden usar cadenas escritas por nosotros o con texto proporcionado por el usuario, aquí solo estoy ejemplificando pero al final puede quedar como tú prefieras.
Más abajo dejaré el código completo.
public static void main(String[] args) {
String originalText = "parzibyte.me";
System.out.println("Texto original: " + originalText);
String translatedText = textToBinary(originalText);
System.out.println("Convertido a binario es: " + translatedText);
System.out.println("-----------------");
String binaryText = "1110000 1100001 1110010 1111010 1101001 1100010 1111001 1110100 1100101 101110 1101101 1100101";
System.out.println("Binario: " + binaryText);
String translatedBinary = binaryToText(binaryText);
System.out.println("Convertido a texto es: " + translatedBinary);
// También podemos convertir algo que el usuario proporcione
String userText = "";
Scanner sc = new Scanner(System.in);
System.out.println("Ingresa algún texto y yo lo convertiré a binario: ");
userText = sc.nextLine();
translatedText = textToBinary(userText);
System.out.println(translatedText);
System.out.println("Ingresa un texto en binario y lo convertiré a texto en español: ");
userText = sc.nextLine();
translatedBinary = binaryToText(userText);
System.out.println(translatedBinary);
}
Demostración
Poniendo todo junto
El código completo queda como se ve a continuación:
/*
____ _____ _ _ _
| _ \ | __ \ (_) | | |
| |_) |_ _ | |__) |_ _ _ __ _____| |__ _ _| |_ ___
| _ <| | | | | ___/ _` | '__|_ / | '_ \| | | | __/ _ \
| |_) | |_| | | | | (_| | | / /| | |_) | |_| | || __/
|____/ \__, | |_| \__,_|_| /___|_|_.__/ \__, |\__\___|
__/ | __/ |
|___/ |___/
____________________________________
/ Si necesitas ayuda, contáctame en \
\ https://parzibyte.me /
------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Creado por Parzibyte (https://parzibyte.me). Este encabezado debe mantenerse intacto,
excepto si este es un proyecto de un estudiante.
* */
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String originalText = "parzibyte.me";
System.out.println("Texto original: " + originalText);
String translatedText = textToBinary(originalText);
System.out.println("Convertido a binario es: " + translatedText);
System.out.println("-----------------");
String binaryText = "1110000 1100001 1110010 1111010 1101001 1100010 1111001 1110100 1100101 101110 1101101 1100101";
System.out.println("Binario: " + binaryText);
String translatedBinary = binaryToText(binaryText);
System.out.println("Convertido a texto es: " + translatedBinary);
// También podemos convertir algo que el usuario proporcione
String userText = "";
Scanner sc = new Scanner(System.in);
System.out.println("Ingresa algún texto y yo lo convertiré a binario: ");
userText = sc.nextLine();
translatedText = textToBinary(userText);
System.out.println(translatedText);
System.out.println("Ingresa un texto en binario y lo convertiré a texto en español: ");
userText = sc.nextLine();
translatedBinary = binaryToText(userText);
System.out.println(translatedBinary);
}
public static String binaryToText(String binaryText) {
// Necesitamos separar cada número binario por espacio. Usamos split
String[] binaryNumbers = binaryText.split(" ");
String text = "";
// Los recorremos. En cada paso tenemos al número binario
for (String currentBinary : binaryNumbers) {
// Ahora convertimos ese binario a decimal
int decimal = binaryToDecimal(currentBinary);
// Obtenemos la letra que le corresponde a ese valor ASCII
char letra = (char) decimal;
text += letra;
}
return text;
}
public static String textToBinary(String originalText) {
String binaryText = "";
for (int i = 0; i < originalText.length(); i++) {
// Primero obtenemos la letra o carácter actual
char currentChar = originalText.charAt(i);
// Necesitamos obtener su representación entera ASCII
int ascii = (int) currentChar;
// Una vez que ya tenemos el entero, lo convertimos a binario
String binary = decimalToBinary(ascii);
// Lo agregamos a la cadena resultante agregando además un espacio
binaryText += binary + " ";
}
// Finalmente regresamos el texto
return binaryText;
}
public static int binaryToDecimal(String binary) {
// A este número le vamos a sumar cada valor binario
int decimal = 0;
int position = 0;
// Recorrer la cadena...
for (int x = binary.length() - 1; x >= 0; x--) {
// Saber si es 1 o 0; primero asumimos que es 1 y abajo comprobamos
short digit = 1;
if (binary.charAt(x) == '0') {
digit = 0;
}
/*
Se multiplica el dígito por 2 elevado a la potencia
según la posición; comenzando en 0, luego 1 y así
sucesivamente
*/
double multiplier = Math.pow(2, position);
decimal += digit * multiplier;
position++;
}
return decimal;
}
public static String decimalToBinary(int decimal) {
if (decimal <= 0) {
return "0";
}
String binary = "";
while (decimal > 0) {
short remainder = (short) (decimal % 2);
decimal = decimal / 2;
// Insertar el dígito al inicio de la cadena
binary = String.valueOf(remainder) + binary;
}
return binary;
}
}
Recuerda que puedes adaptarlo a tus necesidades, traducirlo, copiar solo algunas funciones, etcétera.
¿Más de Java? claro que sí, justo aquí.