Why is the last letter of my code replaced by a question mark "?"?

Asked

Viewed 111 times

3

The teacher asked for a C# code as a term paper that encrypts a text from a file.

The code isn’t polished yet or anything, I’m just doing the raw then I’ll add more things, but my problem is that every time the last letter of my text comes out ?.

For example:

Good evening > Encryption > Decryption > Good noit?

It’s two codes one to encrypt and the other to decrypt:

Encrypt:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Cript
{
class Program
{
    static void Main(string[] args)
    {
        //declaração das variáveis
        string sDrive, sArquivo = "", sPalavra, sTexto = "",sOpcao;

        //método write escreve na tela do usuario
        Console.WriteLine("|---------------------------------------------------|");
        Console.WriteLine("| Gostaria de Criptografar Uma Mensagem ? (Sim/Não) |");
        Console.WriteLine("|---------------------------------------------------|");
        Console.Write("--->>>>>>>>");

        //Aqui é feito uma conversão, pois a opcao é inicialmente uma string
        sOpcao = Console.ReadLine();

        //PEDE VALORES DO ARQUIVO A SER CRIADO
        Console.Write("Digite em Qual driver o arquivo sera salvo: ");
        sDrive = Console.ReadLine();
        Console.Write("Digite o Nome do Arquivo(Sem a Extensão .txt): ");
        sArquivo = Console.ReadLine();

        //depois da conversão o switch verifica a opcao digitada
        if ((sOpcao == "s") || (sOpcao == "sim") || (sOpcao == "S" ) || (sOpcao == "SIM") || (sOpcao == "Sim"))
        {
            Console.Write("Entre com a mensagem para ser criptografada: ");

            //sPalavra é a variavel que o usuario vai digitar.                    
            sPalavra = Console.ReadLine();

            int[] iAscii = new int[sPalavra.Length];
            char[] cChar = new char[sPalavra.Length];

            //enquanto a palavra for menor que i
            for (int i = 0; i < sPalavra.Length; i++)
            {
                //Transforma o texto no codigo ASCII dele e retira 5 posições na tabela ASCII (para criptografar) 
                iAscii[i] = ((int)sPalavra[i]);
                iAscii[i] = iAscii[i] + 5;
                cChar[i] = ((char)iAscii[i]);
                sTexto = sTexto + cChar[i];
            }

            // Cria e Grava o Arquivo
            sArquivo = sDrive + ":" + sArquivo + ".txt";
            using (StreamWriter arquivo = File.CreateText(sArquivo))
            {
                arquivo.WriteLine(sTexto);
                arquivo.Close();
            }

            // Mostra na Tela o Arquivo Criado
            Console.WriteLine("Arquivo Criado Como: " + sArquivo);
            Console.ReadKey();
        }
    }
}
}

Decrypt:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace DeCrypt
{
    class Program
    {
        static void Main(string[] args)
        {
            //declaração das variáveis
            string sDrive, sArquivo, sPalavra = "", sTexto = "",sOpcao;


            //método write escreve na tela do prompt do usuario
            Console.WriteLine("|---------------------------------------------------|");
            Console.WriteLine("| Gostaria de Descriptografar Uma Mensagem ? (S/N)  |");
            Console.WriteLine("|---------------------------------------------------|");
            Console.WriteLine("--->>>>>> ");

            //Aqui é feito uma conversão, pois o opcao é inicialmente uma string
            sOpcao = Console.ReadLine();

            //Aqui, A pessoa digitara o nome e o drive do arquivo
            Console.WriteLine("Letra do Drive do Arquivo Instalado: ");
            sDrive = Console.ReadLine();
            Console.WriteLine("Digite o Nome do Arquivo(Sem Extensão): ");
            sArquivo = Console.ReadLine();
            sArquivo = sDrive + ":" + sArquivo + ".txt";

            if (!File.Exists(sArquivo))
            {
                Console.WriteLine("Arquivo " + sArquivo + " não Existe." );
            }
            else
            {
                Console.WriteLine("O ARQUIVO DESCRIPTOGRAFADO FICOU ASSIM: ");

                // ABRE ARQUIVO TEXTO
                sPalavra = File.ReadAllText(sArquivo);
                //depois da conversão o switch verifica a opcao digitada
                switch (sOpcao)
                {
                    //caso a opcao escolhida for 2
                    case "s":
                        int[] iAscii = new int[sPalavra.Length];
                        char[] cChar = new char[sPalavra.Length];

                        //enquanto a palavra for menor que i
                        for (int i = 0; i <= sPalavra.Length; i++)
                        {
                            //Transforma o texto no codigo ASCII dele e Acrescenta 5 posições na tabela ASCII (para criptografar) 
                            iAscii[i] = ((int)sPalavra[i]);
                            iAscii[i] = iAscii[i] - 5;
                            cChar[i] = ((char)iAscii[i]);
                            sTexto = sTexto + cChar[i];
                        }
                        Console.WriteLine(sTexto);
                        Console.ReadKey();
                        break;
                }
            }
        }
    }
}

2 answers

5


Your encryption routine is working, as this example on dotNETFiddle can demonstrate:

https://dotnetfiddle.net/WIouyV

using System;

public class Program
{
    public static void Main()
    {
        string sPalavra, sTexto = "";

        Console.WriteLine("Criptografando...");

        sPalavra = "Boa noite";

        int[] iAscii = new int[sPalavra.Length];
        char[] cChar = new char[sPalavra.Length];

        for (int i = 0; i < sPalavra.Length; i++)
        {
            iAscii[i] = ((int)sPalavra[i]);
            iAscii[i] = iAscii[i] + 5;
            cChar[i] = ((char)iAscii[i]);
            sTexto = sTexto + cChar[i];
        }

        Console.WriteLine(sTexto);

        Console.WriteLine("Descriptografando...");

        sPalavra = "Gtf%stnyj";
        sTexto = "";

        iAscii = new int[sPalavra.Length];
        cChar = new char[sPalavra.Length];

        for (int i = 0; i < sPalavra.Length; i++)
        {
            iAscii[i] = ((int)sPalavra[i]);
            iAscii[i] = iAscii[i] - 5;
            cChar[i] = ((char)iAscii[i]);
            sTexto = sTexto + cChar[i];
        }

        Console.WriteLine(sTexto);
    }
}

Encrypting...
Gtf%stnyj
Decrypting...
Good night

What happens is that you are using the method TextWriter.WriteLine, which automatically adds the end-of-line marker (Environment.NewLine) composed of the characters Carriage Return (ASCII 13) and Line Feed (ASCII 10), thus increasing its string from 9 to 11 characters ("Boa noite" + CR + LF).

I have no way to test now, but I think your file reading routine is including this bookmark in the 'decryption' cycle - which would be a possible cause of the return with the character '?'.

  • Bro, I can’t tell you how grateful I am for your help, so thank you very much !!!!

  • @Pedroanselmo No, it’s always a pleasure to help! Then let us know if you managed to get your code to work. =)

  • @Pedroanselmo if the answer solved your problem, click on the blue "V" next to it to mark as accepted, so appears as solved in the listing of the site, and indicates the solution for future readers.

3

Complementing the analysis of Onosendai:

is yes including an improper line while writing to text file, after adjusting this worked.

Also remove the "=" from your loop in the decryp method, otherwise you will present the error: System.Indexoutofrangeexception.

for (int i = 0; i <= sPalavra.Length; i++)

Whenever translating "good night" will be the same text? Read about asymmetric encryption to make your code less vulnerable

  • Sorry... that "=" wasn’t even in the code. This was one of the attempts to fix the problem and I ended up putting together, but I found out quickly that this error happened. Thanks anyway.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.