c# проблема со сжатием / декомпрессией - PullRequest
0 голосов
/ 07 апреля 2020

Я компьютерный ученик, и мы начали C # 3 месяца go. Я просто попросил вас помочь, потому что я должен выполнить проект типа «WhatsApp». Цель состоит в том, чтобы зашифровать и сжать сообщение. Я могу зашифровать сообщение и сжать его, но не могу его распаковать. У меня ошибка типа «System.IO.InvalidDataException:« Число волхвов c в заголовке GZip неверно. Убедитесь, что ваш переход происходит в потоке GZip ». Я скопировал код в другую топи c и попытался адаптировать его к моей программе, но безрезультатно. Спасибо за ваше понимание.

Мой проект выполнен с Windows формами. Комментарии на французском (потому что я французский, а мой учитель спрашивает французские комментарии), но я думаю, что мой код довольно понятен.

Редактировать: проблема возникает с моим методом "Декомпрессия" в строке 139

Мой проект: https://eduvaud-my.sharepoint.com/: u: / g / personal / mathias_rogey_eduvaud_ch / EaMn6Ic_QHZEgP98u45i73sBHsnpnI3lEeWWZdtkud7WPg? E = isYob C*1001* Говорят о том, что я говорю о 1019

/ Строка декомпрессии с C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.IO.Compression;

namespace ChatApp
{
    public partial class Form1 : Form
    {
        private static string strPath = @"..\..\..\messages\communication.txt";

        const byte byteNbrMsg = 2;

        private static short shrtNbrRandom = 947;

        public Form1()
        {
            InitializeComponent();

            byte[] r1 = Zip("StringStringStringStringStringStringStringStringStringStringStringStringStringString");
            string r2 = Unzip(r1);

            Decryptage();

            chatBox.Items.Add(r2);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Cryptage(messageBox.Text);
        }

        private void Decryptage()
        {
            // variables
            string[] Tab_strDecryptage = Array.Empty<string>();
            string strMessgeDecrypt = string.Empty;
            byte[] Tab_byteDecompress = Array.Empty<byte>();
            string strMessageDecompress;

            // permet de lire les 10 derniers messages et les mets dans un string de byteNbrMsg
            List<string> strText = File.ReadLines(strPath).Reverse().Take(byteNbrMsg).ToList();

            // decrypte les messages
            using (StreamReader sr = new StreamReader(strPath))
            {
                // boucle for qui decrypte les x derniers messages
                for (int i = 0; i < byteNbrMsg; i++)
                {
                    // split le string actuel en l'inversant ( vu que on inverse la lecture des string dans le string )
                    //Tab_strDecryptage = strText[i].Split('\\').ToArray();

                    strMessageDecompress = strText[i];

                    Tab_byteDecompress = Encoding.ASCII.GetBytes(strMessageDecompress);

                    Unzip(Tab_byteDecompress);

                    // boucle foreach qui permet de decrypter chaque entrée du tableau
                    foreach (string item in Tab_strDecryptage)
                    {
                        try
                        {
                            // ajoute au string chaque caractère decrypté lu de la ligne
                            strMessgeDecrypt += ((char)(Math.Sqrt(Convert.ToUInt64(item)) / shrtNbrRandom));
                        }
                        catch (Exception)
                        {

                        }
                    }

                    // ecrit le string
                    chatBox.Items.Add(strMessgeDecrypt);

                    // vide le string
                    strMessgeDecrypt = "";
                }
            }
            // 45 ms pour completer
        }

        private void Cryptage(string strUser)
        {
            // variables
            byte[] byteASCII;
            string strCryptage = string.Empty;
            string strETML = Path.GetFileName(Environment.GetEnvironmentVariable("USERPROFILE"));
            byte[] Tab_byteCompress = new byte[1];
            string strCompress;

            // ecrit les caractère en ASCII
            byteASCII = Encoding.ASCII.GetBytes(strETML + " : " + strUser);

            // crypte les messages
            foreach (byte item in byteASCII)
            {
                // ecrit dans le string chaque caractères crypté séparé par un " \ "
                strCryptage += ((ulong)(Math.Pow(item * shrtNbrRandom, 2)) + "\\");
            }

            // permet de compresser le string crypté
            strCompress = Encoding.ASCII.GetString(Zip(strCryptage));

            // ecrit le string dans le document texte
            using (StreamWriter write = new StreamWriter(strPath, true))
            {
                write.WriteLine(strCompress);
            }
        }

        private void messageBox_TextChanged(object sender, EventArgs e)
        {
            if (messageBox.Text != "")
            {
                sendButton.Visible = true;
            }
            else
            {
                sendButton.Visible = false;
            }
        }


        public void CopyTo(Stream src, Stream dest)
        {
            byte[] bytes = new byte[4096];

            int cnt;

            // erreur: System.IO.InvalidDataException : 'Le nombre magique dans l'en-tête GZip n'est pas correct. Assurez-vous que votre passage s'opère dans un flux GZip.'
            while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0)
            {
                dest.Write(bytes, 0, cnt);
            }
        }

        public byte[] Zip(string str)
        {
            var bytes = Encoding.UTF8.GetBytes(str);

            using (var msi = new MemoryStream(bytes))
            using (var mso = new MemoryStream())
            {
                using (var gs = new GZipStream(mso, CompressionMode.Compress))
                {
                    //msi.CopyTo(gs);
                    CopyTo(msi, gs);
                }

                return mso.ToArray();
            }
        }

        public string Unzip(byte[] bytes)
        {
            using (var msi = new MemoryStream(bytes))
            using (var mso = new MemoryStream())
            // mso n'a aucune valeur en input
            // le but est de copier GS qui a des valeurs a MSO
            {
                using (var gs = new GZipStream(msi, CompressionMode.Decompress))
                {
                    //gs.CopyTo(mso);
                    CopyTo(gs, mso);
                }

                return Encoding.UTF8.GetString(mso.ToArray());
            }
        }
    }
}

1 Ответ

0 голосов
/ 07 апреля 2020

В настоящее время вы записываете в файл свой зашифрованный байт [], используя ASCII.GetString(), и читаете из файла, используя ASCII.GetBytes(). Проблема возникает здесь; значение байта [], которое вы записали в файл, отличается от значения, получаемого после чтения из файла и преобразования в byte [].

Вместо ASCII, если вы используете Base64String, оно должно работать. Вам нужно изменить две строки (я закомментировал эти строки и добавил новую версию чуть ниже):

В методе Расшифровка :

//Tab_byteDecompress = Encoding.ASCII.GetBytes(strMessageDecompress);
Tab_byteDecompress = Convert.FromBase64String(strMessageDecompress);

В методе Cryptage :

//strCompress = Encoding.ASCII.GetString(Zip(strCryptage));
strCompress = Convert.ToBase64String(Zip(strCryptage));
...