Exemplo n.º 1
0
        private void DecodeBtn_Click(object sender, EventArgs e)
        {
            using OpenFileDialog openFile = new OpenFileDialog
                  {
                      Filter = "RS files (*.bin)|*.bin"
                  };
            if (openFile.ShowDialog() != DialogResult.OK)
            {
                return;
            }
            if (!File.Exists(openFile.FileName))
            {
                return;
            }
            using BinaryReader reader = new BinaryReader(File.OpenRead(openFile.FileName));
            int    n      = reader.ReadInt32();
            int    k      = reader.ReadInt32();
            string ext    = reader.ReadString();
            long   length = reader.ReadInt64();

            byte[] tempFile = reader.ReadBytes((int)(reader.BaseStream.Length - reader.BaseStream.Position));
            byte[] origFile = new byte[length];

            RSCS rs     = new RSCS((byte)n, (byte)k);
            int  blocks = tempFile.Length / n;
            int  errors = 0;

            for (int j = 0; j < blocks - 1; j++)
            {
                errors += rs.DecodeBuffer(ref tempFile[j * n]);
                Buffer.BlockCopy(tempFile, j * n, origFile, j * k, k);
            }
            errors += rs.DecodeBuffer(ref tempFile[(blocks - 1) * n]);
            Buffer.BlockCopy(tempFile, (blocks - 1) * n, origFile, (blocks - 1) * k, origFile.Length - (blocks - 1) * k);
            string info = "Исправлено " + errors.ToString() + " ошибок" + Environment.NewLine;

            string restoredName = Path.Combine(Path.GetDirectoryName(openFile.FileName),
                                               Path.GetFileNameWithoutExtension(openFile.FileName) + "-restored" + ext);

            using BinaryWriter writer = new BinaryWriter(File.Create(restoredName));
            writer.Write(origFile);
            writer.Flush();
            MessageBox.Show(info + "Файл " + Path.GetFileName(restoredName) + " сохранён");
        }
Exemplo n.º 2
0
        private void EncodeBtn_Click(object sender, EventArgs e)
        {
            if (testFile == null || testFile.Length < 1024)
            {
                return;
            }
            int fileSz = testFile.Length - 256;
            int t = 32, k = int.Parse(blockSzCB.SelectedItem.ToString());
            int blockCount = 1 + fileSz / k, n = k + t * 2;

            byte[] tempFile = new byte[blockCount * n];
            RSCS   rs       = new RSCS((byte)n, (byte)k);

            for (int j = 0; j < blockCount; j++)
            {
                Buffer.BlockCopy(testFile, j * k, tempFile, j * n, k);
                rs.EncodeBuffer(ref tempFile[j * n]);
            }

            using (SaveFileDialog saveFile = new SaveFileDialog())
            {
                saveFile.FileName = Path.ChangeExtension(testFileName, "bin");
                if (saveFile.ShowDialog() != DialogResult.OK)
                {
                    return;
                }
                using (BinaryWriter writer = new BinaryWriter(File.Create(saveFile.FileName)))
                {
                    writer.Write(n);
                    writer.Write(k);
                    writer.Write(Path.GetExtension(testFileName));
                    writer.Write(testFileLength);
                    writer.Write(tempFile);
                    writer.Flush();
                }
                MessageBox.Show("Файл " + Path.GetFileName(saveFile.FileName) + " сохранён");
            }
        }