Статьи Королевства Дельфи


S003


Королевство Дельфи
"Knowledge itself is power"
F.Bacon
Разное

Вернуться к разделу

Содержание:

  • .
Стеганография. Вариант "вшивания" данных в файл-картинку *.bmp;

Скачать проект (14 К)

Суть подхода в следующем: скрыть какие-либо данные от постороннего глаза, спрятав их в битмэп. При этом размер файла не меняется и рисунок не разрушается.
Я решил это следующим способом - каждая точка описывается 3 компонентами R, G и B (для 24-битных рисунков, а другие конвертируются в этот режим ). Если яркость какой-либо из этих компонент изменится на 1/255 этого никто не заметит. Что и требуется. Скрываемую информацию по битикам запихиваем в младшие биты RGB компонент. При считывании, наоборот, из младшего бита RGB компонент собираем данные.

Автор: Дмитрий Спорыхин

ISAPI: получения от клиента данных больщого размера.

При программировании ISAPI скриптов иногда возникает необходимость получения данных от клиента достаточно больщого размера. В этом случае передаваемые данные делятся на два куска - один, размером в 48к, расположен непосредственно в Request.Content и + оставшаяся часть, содержимое которой нужно дочитывать специальной функцией ReadClient. оставшаяся часть, которую нужно В справке по ISAPI (как от Inprise, так и Microsoft) очень мало информации на эту тему, не говоря уже о примерах. У MS для функции ReadClient вообще получается очень интересно:
If more than lpdwSize bytes are immediately available to be read, ReadClient will return after transferring that amount of data into the buffer. Otherwise, it will block and wait for data to become available.

Использование значения ContentLength напрямую (как это рекомендуется в документации) невозможно , ибо оно содержит полный размер передаваемых данных (причем я сильно не уверен в равенстве размеров высылаемого и принимаемого пакетов).
После долгих и изнурительных боев я выяснил что

  • 1. Лучше всего передвать от клиента данные так: NMHttp1.OutputFileMode := TRUE; NMHttp1.Post(URL, FileName); NMHttp1.OutputFileMode := FALSE;
  • 2. Для получения полного содержимого передваемых данных лучше использовать следующую функцию: function LoadFullContent(Request: TWebRequest): TStrings; var Stream: TStream; Buff: Array[0..1024] of Char; Count: Integer; begin Result := TStringList.Create; try Stream := TMemoryStream.Create; try Request.ContentFields.SaveToStream(Stream); repeat Count := Request.ReadClient(Buff, 1024); if Count = -1 then Break; Stream.Write(Buff, Count); until (Stream.Size >= Request.ContentLength); Stream.Seek(0, soFromBeginning); Result.LoadFromStream(Stream); finally Stream.Free; end; except Result.Free; raise; end; end;
Автор: Дмитрий Полщанов




Начало  Назад  Вперед



Книжный магазин