
- •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
- •Лист регистрации изменений
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
}
}