Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Текст программы.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
102.68 Кб
Скачать

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

    }

}