
- •VStepanov.CourseWork.First Common.Cs
- •VStepanov.CourseWork.First.Binary BmpInfo.Cs
- •ByteMixer.Cs
- •Relocator.Cs
- •VStepanov.CourseWork.First.Cryptography
- •XorCodec.Cs
- •VStepanov.CourseWork.First.Steganography Steganogram.Cs
- •SteganogramBmp.Cs
- •SteganogramInfo.Cs
- •SteganogramMessage.Cs
- •VStepanov.CourseWork.First.Gui AnimatedForm.Cs
- •FileAddForm.Cs
- •GuiMethods.Cs
- •PasswordRequest.Cs
- •Program.Cs
- •SplashForm.Cs
- •TextAddForm.Cs
- •TextReadForm.Cs
- •Лист регистрации изменений
VStepanov.CourseWork.First.Steganography Steganogram.Cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
[assembly: CLSCompliant(true)]
namespace VStepanov.CourseWork.First.Steganography
{
/// <summary>
/// Представляет стеганограмму и методы работы с ней.
/// </summary>
public abstract class Steganogram
{
#region Поля объекта класса
/// <summary>
/// Содержит информацию о стеганограмме в заданном файле при её наличии. Null иначе.
/// </summary>
public SteganogramInfo? Info { get; protected set; }
/// <summary>
/// Содержит информацию и методы для работы с файлом-контейнером стеганограммы.
/// </summary>
public FileInfo ContainerFile { get; protected set; }
#endregion
#region Конструкторы
/// <summary>
/// Связывает стеганограмму с файлом-контейнером и выполняет инициализацию полей информации.
/// </summary>
/// <param name="fileInfo">Информация и методы для работы с файлом-контейнером.</param>
public Steganogram(FileInfo fileInfo)
{
ContainerFile = fileInfo;
InitializeSteganogram();
}
#endregion
#region Чтение стеганографических данных из файла
/// <summary>
/// Возвращает сообщение, считанное из файла-контейнера.
/// </summary>
/// <returns>Сообщение, содержавшееся в стеганограмме.</returns>
public abstract SteganogramMessage GetMessage();
#endregion
#region Запись стеганографических данных в файл
/// <summary>
/// Записывает сообщение и соответствующую информацию в связанный со стеганограммой файл.
/// </summary>
/// <param name="steganogramInfo">Информация о стеганограмме, замещает текущую информацию о файле.</param>
/// <param name="steganogramMessage">Сообщение, подлежащее стеганографированию.</param>
public virtual void WriteSteganogramToFile(SteganogramInfo steganogramInfo, SteganogramMessage steganogramMessage)
{
WriteInfoToFile(steganogramInfo);
WriteMessageToFile(steganogramInfo, steganogramMessage);
this.Info = steganogramInfo;
}
/// <summary>
/// Записывает информацию о стеганограмме в файл.
/// </summary>
/// <param name="steganogramInfo">Информация о записываемой стеганограмме.</param>
protected abstract void WriteInfoToFile(SteganogramInfo steganogramInfo);
/// <summary>
/// Записывает сообщение в файл-контейнер.
/// </summary>
/// <param name="steganogramInfo">Информация о записываемой стеганограмме, определяет параметры записи сообщения.</param>
/// <param name="steganogramMessage">Сообщение, подлежащее записи.</param>
protected abstract void WriteMessageToFile(SteganogramInfo steganogramInfo, SteganogramMessage steganogramMessage);
#endregion
#region Чтение и запись байтов из файла
/// <summary>
/// Читает заданное число байт из файла-контейнера, начиная с заданного смещения.
/// </summary>
/// <param name="count">Число байт, которые необходимо считать.</param>
/// <param name="offset">Смещение от начала файла.</param>
/// <returns>Массив, содержащий заданное число байт файла-контейнер, начиная с заданного смещения.</returns>
protected virtual byte[] ReadBytesFromFile(int count, int offset)
{
byte[] sourceBytes;
using (var binaryReader = GetBinaryReader(offset))
{
sourceBytes = binaryReader.ReadBytes(count);
}
return sourceBytes;
}
/// <summary>
/// Записывает переданные в метод данные в файл-контейнер, начиная с заданного смещения.
/// Запись производится в режиме перезаписи.
/// </summary>
/// <param name="data">Данные, которые необходимо записать.</param>
/// <param name="offset">Смещение от начала файла.</param>
protected virtual void WriteBytesToFile(byte[] data, int offset)
{
using (var binaryWriter = GetBinaryWriter(offset))
{
binaryWriter.Write(data);
}
}
#endregion
#region Получение доступа к ассоциированному файлу
/// <summary>
/// Создаёт объект класса BinaryReader, привязанный к файлу-контейнеру, с заданным смещением.
/// </summary>
/// <param name="offset">Смещение от начала файла.</param>
/// <returns>Объект класса BinaryReader, привязанный к файлу-контейнеру, с заданным смещением.</returns>
protected virtual BinaryReader GetBinaryReader(int offset)
{
var binaryReader = new BinaryReader(ContainerFile.Open(FileMode.Open, FileAccess.Read, FileShare.Read));
binaryReader.BaseStream.Seek(offset, SeekOrigin.Begin);
return binaryReader;
}
/// <summary>
/// Создаёт объект класса BinaryWriter, привязанный к файлу-контейнеру, с заданным смещением.
/// </summary>
/// <param name="offset">Смещение от начала файла.</param>
/// <returns>Объект класса BinaryWriter, привязанный к файлу-контейнеру, с заданным смещением.</returns>
protected virtual BinaryWriter GetBinaryWriter(int offset)
{
var binaryWriter = new BinaryWriter(ContainerFile.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None));
binaryWriter.BaseStream.Seek(offset, SeekOrigin.Begin);
return binaryWriter;
}
#endregion
#region Прочие методы класса
/// <summary>
/// Возвращает максимальное число байт, которое можно записать в контейнер.
/// </summary>
/// <param name="stegLevel">Уровень сокрытия информации</param>
/// <returns>Максимальное число байт</returns>
public abstract int GetMessageMaxLength(int stegLevel);
/// <summary>
/// Производит необходимые действия для инициализации объекта класса.
/// </summary>
protected abstract void InitializeSteganogram();
#endregion
}
}