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) + " сохранён"); }
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) + " сохранён"); } }