Jump to content

Recommended Posts

Posted

Boas!!

Eu tenho que Implementar o programa para a descodificação de mensagens com recurso a uma

CircularArrayQueue, eu já implementei o arraycircular e parece estar a funcionar, agora onde eu tenho a duvida é fazer o método que descodifique a mensagem. Para descodificar a mensagem, eu tenho uma chave, por exemplo 3 1 7 4 2 5, E a mensagem é novanjghi mu urxlv o resultado devia ser KNOWLEDGE IS POWER.

Alguem me pode ajudar?

Posted (edited)
(((k + 3) - a) % 26) + a) => n
(((n + 1) - a) % 26) + a) => o
(((o + 7) - a) % 26) + a) => v
(((w + 4) - a) % 26) + a) => a
(((l + 2) - a) % 26) + a) => n
(((e + 5) - a) % 26) + a) => j
(((d + 3) - a) % 26) + a) => g
(((g + 1) - a) % 26) + a) => h
...
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted

Boas!!

Já que tinha de fazer um descodificador, também fiz um codificador, o codificador esta a funcionar, agora a minha duvida é como eu volto a descodificar a mensagem usei o que tu me disseste em cima.

Eu por exemplo ponho um A e ele devolve me um I,sms = sms + (char) ((((A + chave[0]) - 65) % 26) + 65)= I

agora como é que eu volto obter o A.(A chave é aleatória usei a Random Classe, e tenho os valores guardados no array chave);

Posted

Ja consegui, mas não sei se era isto que o prof pretendia mas fica aqui o codigo.

private QuequeADT<String> array = new ArrayCircular<String>();
private int[] chave;
private String mensageM;
String codificador(String mensagem) {

 mensagem = mensagem.toUpperCase();
 String sms = "";
 chave = new int[mensagem.trim().length()];
 Random chavealeotoria = new Random();
 for (int i = 0; i < chave.length; i++) {
	 chave[i] = 1 + chavealeotoria.nextInt(90);

 }
 for (int i = 0, j = 0; i < mensagem.length(); i++, j++) {
	 if (mensagem.charAt(i) == ' ') {
		 sms += " ";
	 } else {
		 array.enqueue(""+mensagem.charAt(i));
		 sms = sms + (char) ((((mensagem.charAt(i) + chave[j]) - 65) % 26) + 65);
	 }
 }
 mensageM = sms;
 return sms;
}
String decodificador() {
 String sms="";

 for (int i = 0, j = 0; i < mensageM.length(); i++, j++) {
	 if (mensageM.charAt(i) == ' ') {
		 sms += " ";

	 } else {
		 sms=sms+array.dequeue();
	 }

 }
 return sms;

}

Posted

ora bem, para tentares ver o problema no teu código, tenta criar uma classe que implementa esta interface

public interface IMessageCodec
{
 /**
  * Função usada para ler a chave que codifica as mensagens
  *
  * @return Array com a chave usada
  */
 public int[] getKey();

 /**
  * Função usada para alterar a chave que codifica as mensagens
  *
  * @param key Array com a chave a ser usada
  */
 public void setKet(int[] key);

 /**
  * Função usada para codificar a mensagem
  *
  * @param message Mensagem a ser codificada
  * @return        Mensagem codificada
  */
 public String encode(String message);

 /**
  * Função usada para descodificar a mensagem
  *
  * @param message Mensagem a ser descodificada
  * @return        Mensagem descodificada
  */
 public String decode(String message);
}
IRC : sim, é algo que ainda existe >> #p@p
Posted

Boas!

Pelo que eu percebi no meu código eu só consigo descodificar, se tiver alguma coisa na mensageM, ou seja se já tiver codificado alguma mensagem, na interface que tu forneceste posso codificar e descodificar mensagens desde que tenha a chave. É isto?

Posted

Boas!!

Fiz umas alterações no meu código, usei mais ao menos a tua interface só acrescentei ao descodificar e ao codificar a chave ou seja passo a mensagem e a chave, agora tenho um problema por exemplo:

codificar("Joao","1111") e da me GLXL agora no

descodificar("GLXL","1111") e da me DIUI,

e eu queria que desse joao, eu codifico a mensagem desta forma ((((mensagem.charAt(i) + chave.charAt(j)) - 65) % 26) + 65); como e que eu posso descodificar para que o resultado seja o que eu pretendo?

Posted

Eu acho que sim.

public String codificar(String mensagem,String chave) {
 String sms = "";

 mensagem = mensagem.toUpperCase();
 setChave(chave);

 for (int i = 0, j = 0; i < mensagem.length(); i++, j++) {
	 if (mensagem.charAt(i) == ' ') {
		 sms += " ";
	 } else {
		 lista.enqueue("" + mensagem.charAt(i));
		 sms = sms + (char) ((((mensagem.charAt(i) + chave.charAt(j)) - 65) % 26) + 65);
	 }
 }

 return sms;
}
Posted

Nao, mas isso e porque o meu professor so andava para tras a chave, ou seja tinha o n chave 3 dava k, mas isso agora eu so tenho de alterar a maneira como estou a codificar a mensagem em vez de fazer como me disseste, ponho n-3. Mas acho a tua maneira de codificar mais engraçada,e mais complexa.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.