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

SteganogramInfo.Cs

using System;

using System.Runtime.InteropServices;

namespace VStepanov.CourseWork.First.Steganography

{

    /// <summary>

    /// Хранит общую информацию о стеганограмме.

    /// Записывается в файл вместе с сообщением, используется также для извлечения сообщения из контейнера.

    /// </summary>

    public struct SteganogramInfo

    {

        #region Константы

        /// <summary>

        /// Размер структуры с информацией о стеганограмме, вычисляется при запуске.

        /// </summary>

        public static readonly int StructureSize = Marshal.SizeOf(typeof(SteganogramInfo));

        /// <summary>

        /// Сигнатура стеганограммы

        /// </summary>

        public const int SignatureValue = CommonConstants.SteganographicalSignature;

        /// <summary>

        /// Число последних бит для хранения информации о стеганограмме.

        /// </summary>

        public const int nLastBitsUsingForInfo = CommonConstants.nLastBitsUsingForInfo;

        /// <summary>

        /// Число байт контейнера, необходимое для хранения одного байта информации.  

        /// </summary>

        public static readonly int PartsForInfo = CommonMethods.GetPartsCount(nLastBitsUsingForInfo);

        #endregion

        #region Поля

        /// <summary>

        /// Сигнатура стеганограммы.

        /// </summary>

        public int Signature { get; private set; }

        /// <summary>

        /// Размер передаваемого сообщения.

        /// </summary>

        public int MessageSize { get; private set; }

        /// <summary>

        /// Число последних бит, используемых для записи сообщения.

        /// </summary>

        public int nLastBitsUsing { get; private set; }

        /// <summary>

        /// Тип передаваемого сообщения.

        /// </summary>

        public MessageType MessageType { get; private set; }

        #endregion

        #region Конструкторы

        /// <summary>

        /// Создаёт новый объект SteganogramInfo, основываясь на сообщении для записи

        /// и числе последних бит контейнера, которые будут использованы.

        /// </summary>

        /// <param name="message">Cообщение, подлежащее стеганографированию.</param>

        /// <param name="nLastBitsUsing">Число последних бит, используемых для записи сообщения.</param>

        public SteganogramInfo(SteganogramMessage message, int nLastBitsUsing)

        {

            this = new SteganogramInfo();

            this.MessageSize = SteganogramMessage.GetBytes(message).Length;

            this.nLastBitsUsing = nLastBitsUsing;

            this.MessageType = message.MessageType;

            Sign();

        } 

        #endregion

        #region Работа с дампами

        /// <summary>

        /// Переводит структуру в массив байт, пригодный для записи и обратного конвертирования в структуру.

        /// </summary>

        /// <param name="steganorgramInfo">Структура для перекодировки.</param>

        /// <returns>Массив байт, представляющий собой переданную структуру.</returns>

        public static byte[] GetBytes(SteganogramInfo steganorgramInfo)

        {

            int size = StructureSize;

            byte[] bytes = new byte[size];

            IntPtr ptr = Marshal.AllocHGlobal(size);

            Marshal.StructureToPtr(steganorgramInfo, ptr, true);

            Marshal.Copy(ptr, bytes, 0, size);

            Marshal.FreeHGlobal(ptr);

            return bytes;

        }

        /// <summary>

        /// Переводит массив байт в структуру.

        /// </summary>

        /// <param name="bytes">Массив байт, представляющий собой структуру.</param>

        /// <returns>Структура SteganogramInfo, восстановленная из переданного массива байт.</returns>

        public static SteganogramInfo FromBytes(byte[] bytes)

        {

            SteganogramInfo steganogramInfo = new SteganogramInfo();

            int size = StructureSize;

            IntPtr ptr = Marshal.AllocHGlobal(size);

            Marshal.Copy(bytes, 0, ptr, size);

            steganogramInfo = (SteganogramInfo)Marshal.PtrToStructure(ptr, steganogramInfo.GetType());

            Marshal.FreeHGlobal(ptr);

            return steganogramInfo;

        } 

        #endregion

        #region Прочие методы

        /// <summary>

        /// Подписывает структуру стандартной сигнатурой.

        /// </summary>

        private void Sign()

        {

            Signature = SignatureValue;

        }

        #endregion

    }

}