TCompressionStream инициализировать с данными - PullRequest
6 голосов
/ 26 января 2012

Протокол SPDY указывает для инициализации сжатия данных имени / значения с предварительно определенным блоком данных:

http://mbelshe.github.com/SPDY-Specification/draft-mbelshe-spdy-00.xml#rfc.section.2.6.9.1

(Способ сжатия zlib заключается в том, что он использует меньше битов для строк символов, которые «появляются», чтобы повторяться больше, поэтому, если вы предварительно загрузите сжатие с обычными подозреваемыми, скорее всего, в итоге вы получите меньше битов после сжатия больше времени. Но теперь для моего реального вопроса:)

Возможно ли это с Delphi TCompressionStream из модуля ZLib?

Ответы [ 2 ]

6 голосов
/ 26 января 2012

Вам необходимо использовать deflateSetDictionary . Он доступен в Delphi XE2 ZLib.pas , но классы потоков сжатия не предоставляют поле TZStreamRec для его вызова. Помощники класса могут получить доступ к закрытым полям связанного класса, поэтому вы можете обойти это ограничение, добавив его к TCustomZStream (добавление его к TZCompressionStream не будет работать).

type
  TCustomZStreamHelper = class helper for TCustomZStream
    function SetDictionary(dictionary: PByte; dictLength: Cardinal): Integer;
  end;

function TCustomZStreamHelper.SetDictionary(dictionary: PByte;
  dictLength: Cardinal): Integer;
begin
  if Self is TZCompressionStream then
    Result := deflateSetDictionary(Self.FZStream, dictionary, dictLength)
  else if Self is TZDecompressionStream then
    Result := inflateSetDictionary(Self.FZStream, dictionary, dictLength)
  else raise Exception.Create('Invalid class type');
end;

Просто вызовите SetDictionary со строкой SPDY сразу после создания потока сжатия.

4 голосов
/ 26 января 2012

Необходимая функциональность в ZLib, но не предоставляется Delphi.

Документация Delphi XE2 для ZLib содержит необходимую функцию deflateSetDictionary, указанную только для внутреннего использования.Описание этой функции в разделе руководства по расширенным функциям для руководства ZLib дает понять, что она обладает желаемой функциональностью.

...