2012-01-25 8 views
6

El protocolo SPDY especifica para inicializar la compresión de los datos de nombre/valor con un bloque predefinido de datos:TCompressionStream inicializa con datos

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

(funciona de la compresión de manera zlib es que va a usar menos bits para cadenas de caracteres que parecen 'aparecer' más, así que si precarga la compresión con los sospechosos habituales, es probable que termine con menos bits después de la compresión la mayor parte del tiempo. Pero ahora para mi pregunta real :)

¿Es esto posible con TCompressionStream de Delphi desde la unidad ZLib?

Respuesta

6

Necesita usar deflateSetDictionary. Está disponible en Delphi XE2 ZLib.pas, pero las clases de flujo de compresión no exponen el campo TZStreamRec para invocarlo. Los ayudantes de clase pueden acceder a los campos privados de la clase asociada, por lo que puede evitar dicha limitación agregando uno al TCustomZStream (agregarlo a TZCompressionStream no funcionará).

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; 

Simplemente llame a SetDictionary con la cadena SPDY inmediatamente después de crear la secuencia de compresión.

Cuestiones relacionadas