Dúvida em como fazer conversão de binário para string

Boa Noite à todos do GUJ, peço desculpa se eu tiver postado o tópico em área errada.

Eu sou iniciante de java e eu estou quebrando a cabeça para tentar fazer um conversor binário.

Conversor binário que eu quis dizer é fazer uma palavra ou frase ser convertido para binário e vice-versa.

Eu já consegui fazer converter String para binário, mas não consigo fazer o inverso, por isso eu me registrei para poderem pedir ajuda à vocês

Aqui está o meu código no momento, eu ainda não completei, quando eu conseguir fazer o conversor binário para string eu termino tudo.

package environment;

import java.util.Scanner;

public class environment {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String escolher;
		String texto;
		String binario1;
		String textodecodificado;
		int escolher1;
		while(true)
		{
		System.out.println("Bem vindo ao conversor texto para binário e vice versa do jomp16!");
		System.out.println();
		System.out.println("Digite 1 para converter texto para binário e 2 para converter binário para texto");
		escolher = sc.nextLine();
		escolher1 = Integer.parseInt(escolher); 
		if(escolher1 == 1)
		{
			System.out.println("Converter texto para binário escolhido, digite o texto para converter");
			System.out.println();
			texto = sc.nextLine();
			byte[] bytes = texto.getBytes();
			  StringBuilder binario = new StringBuilder();
			  for (byte b : bytes)
			  {
			     int val = b;
			     for (int i = 0; i < 8; i++)
			     {
			    	 binario.append((val & 128) == 0 ? 0 : 1);
			        val <<= 1;
			     }
			     binario.append(' ');
			  }
			  System.out.println();
			  System.out.println("O texto '" +texto+ "' para binário foi: " +binario);
		}
		if(escolher1 == 2)
		{
			System.out.println("Converter binário para texto escolhido, digite o código para decodificar");
			System.out.println();
			binario1 = sc.nextLine();
			System.out.println("O código dizia : " +textodecodificado);
		}
		break;
		}
	}
}

Bom, tem um detalhe que acho que pode te ajudar. o tipo primitivo char aceita valores numéricos, porém ele imprime um caractere.

Ex:char c = 97; System.out.println(c); //Imprime 'a' Ou seja, se você conseguir converter um número binário para decimal, é só jogar ele em um char :slight_smile:

A teoria pra se converter um número binário para decimal é a seguinte (caso não saiba):

Tendo um número binário, você percorre ele, do último número até o primeiro, multiplicando cada um pela base, elevado à posição em que está, começando do 0. E depois é só somar os resultados.

Ex:

1100001
1 * 2^6 + 1 * 2^5 + 0 * 2^4 + 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0

1 * 2^0 = 1 * 1 = 1
0 * 2^1 = 0 * 2 = 0
0 * 2^2 = 0 * 4 = 0
0 * 2^3 = 0 * 8 = 0
0 * 2^4 = 0 * 16 = 0
1 * 2^5 = 1 * 32 = 32
1 * 2^6 = 1 * 64 = 64

Agora somando os valores temos ==> 1 + 0 + 0 + 0 + 0 + 32 + 64 = 97

Se atribuir esse valor a um char e imprimir, terá sua letra :slight_smile:

[quote=digaoneves]Bom, tem um detalhe que acho que pode te ajudar. o tipo primitivo char aceita valores numéricos, porém ele imprime um caractere.

Ex:char c = 97; System.out.println(c); //Imprime 'a' Ou seja, se você conseguir converter um número binário para decimal, é só jogar ele em um char :slight_smile:

A teoria pra se converter um número binário para decimal é a seguinte (caso não saiba):

Tendo um número binário, você percorre ele, do último número até o primeiro, multiplicando cada um pela base, elevado à posição em que está, começando do 0. E depois é só somar os resultados.

Ex:

1100001
1 * 2^6 + 1 * 2^5 + 0 * 2^4 + 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0

1 * 2^0 = 1 * 1 = 1
0 * 2^1 = 0 * 2 = 0
0 * 2^2 = 0 * 4 = 0
0 * 2^3 = 0 * 8 = 0
0 * 2^4 = 0 * 16 = 0
1 * 2^5 = 1 * 32 = 32
1 * 2^6 = 1 * 64 = 64

Agora somando os valores temos ==> 1 + 0 + 0 + 0 + 0 + 32 + 64 = 97

Se atribuir esse valor a um char e imprimir, terá sua letra :)[/quote]

Bom, eu fiz isso e em parte deu certo, mas será mais trabalhoso pois é letra por letra, eu queria que ele converterse todo o código binário em um texto completo, hoje de manhã ou tarde eu analiso e tento pensar em como implementar.

No momento meu código está assim:

package environment;

import java.util.Scanner;

public class environment {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String escolher;
		String texto;
		String binario1;
		int escolher1;
		char a = 'a';
		char b = 'b';
		char c = 'c';
		char d = 'd';
		char e = 'e';
		char s = 's';
		while(true)
		{
		System.out.println("Bem vindo ao conversor texto para binário e vice versa do jomp16!");
		System.out.println();
		System.out.println("Digite 1 para converter texto para binário e 2 para converter binário para texto");
		escolher = sc.nextLine();
		escolher1 = Integer.parseInt(escolher); 
		if(escolher1 == 1)
		{
			System.out.println("Converter texto para binário escolhido, digite o texto para converter");
			System.out.println();
			texto = sc.nextLine();
			byte[] bytes = texto.getBytes();
			  StringBuilder binario = new StringBuilder();
			  for (byte b1 : bytes)
			  {
			     int val = b1;
			     for (int i = 0; i < 8; i++)
			     {
			    	 binario.append((val & 128) == 0 ? 0 : 1);
			        val <<= 1;
			     }
			     binario.append(' ');
			  }
			  System.out.println();
			  System.out.println("O texto '" +texto+ "' para binário foi: " +binario);
		}
		if(escolher1 == 2)
		{
			System.out.println("Converter binário para texto escolhido, digite o código para decodificar");
			System.out.println();
			binario1 = sc.nextLine();
			int textodecodificado = Integer.parseInt(binario1, 2);
			if(textodecodificado == 115)
			{
				System.out.println("O código dizia : " +s);
			}
			else if(textodecodificado == 97)
			{
				System.out.println("O código dizia : " +a);
			}
		}
		continue;
		}
	}
}

Não, cara… vamos supor que o usuário digite "01010010 01101111 01100100 01110010 01101001 01100111 01101111"você lerá isso em uma linha só. Daí pra frente é só imprimir cada inteiro com um cast para char. binario1 = sc.nextLine(); String[] values = binario1.split(" "); for(int i=0 ; i<values.length ; i++){ char c = (char)Integer.parseInt(values[i], 2); System.out.print(c); }

[quote=digaoneves]Não, cara… vamos supor que o usuário digite "01010010 01101111 01100100 01110010 01101001 01100111 01101111"você lerá isso em uma linha só. Daí pra frente é só imprimir cada inteiro com um cast para char. binario1 = sc.nextLine(); String[] values = binario1.split(" "); for(int i=0 ; i<values.length ; i++){ char c = (char)Integer.parseInt(values[i], 2); System.out.print(c); }[/quote]

Obrigado por me ajudar, deu certo!

Logo logo eu edito o post e posto o código completo, depois eu estou pensando em fazer um conversor binário gráfico, sei que é mais díficil mas não custa nada tentar né :stuck_out_tongue:

Meu programa está completo graças ao digaoneves, veja:

package environment;

import java.util.Scanner;

public class environment {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String escolher;
		String texto;
		String binario1;
		String deseja;
		int escolher1;
		boolean deseja1;
		while(true)
		{
		System.out.println("Bem vindo ao conversor texto para binário e vice versa do jomp16!");
		System.out.println();
		System.out.println("Digite 1 para converter texto para binário e 2 para converter binário para texto");
		System.out.println();
		escolher = sc.nextLine();
		System.out.println();
		escolher1 = Integer.parseInt(escolher); 
		if(escolher1 == 1)
		{
			System.out.println("Converter texto para binário escolhido, digite o texto para converter");
			System.out.println();
			texto = sc.nextLine();
			System.out.println();
			byte[] bytes = texto.getBytes();
			  StringBuilder binario = new StringBuilder();
			  for (byte b1 : bytes)
			  {
			     int val = b1;
			     for (int i = 0; i < 8; i++)
			     {
			    	 binario.append((val & 128) == 0 ? 0 : 1);
			        val <<= 1;
			     }
			     binario.append(' ');
			  }
			  System.out.println("O texto '" +texto+ "' para binário foi: " +binario);
		}
		if(escolher1 == 2)
		{
			System.out.println("Converter binário para texto escolhido, digite o código para decodificar");
			System.out.println();
		    binario1 = sc.nextLine();
		    System.out.println();
		    String[] values = binario1.split(" ");
		    System.out.print("O código dizia: '");
		    for(int i=0 ; i<values.length ; i++){  
		        char c = (char)Integer.parseInt(values[i], 2);  
		        System.out.print(c);
		    }
		    System.out.print("'");
		    System.out.println();
		}
	    System.out.println();
	    System.out.println("Você deseja começar o programa do zero? (S/N)");
	    deseja = sc.nextLine();
	    if(deseja.equals("S"))
	    {
	    	deseja1 = true;
	    }
	    else
	    {
	    	deseja1 = false;
	    }
	    if(deseja1 == true)
	    {
	    	continue;
	    }
	    else
	    {
	    	break;
	    }
	}
	}
}

Se tiverem uma sugestão de melhoria do códigos, postem aqui por favor!

Se o exercício é para estudo, você mesmo podia fazer a conversão de binário para decimal. :slight_smile: