2012-01-25 8 views
6

protokół SPDY określa zainicjować kompresję danych nazwa/wartość z góry określonego bloku danych:TCompressionStream zainicjować z danymi

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

(Kompresja sposób zlib działa jest to, że zużywają mniej bitów dla ciągi znaków, które "pojawiają się", aby ponownie pojawić się więcej, więc jeśli wczytasz kompresję z typowymi podejrzanymi, prawdopodobnie skończysz z mniejszą ilością bitów po kompresji przez większą część czasu.Ale teraz na moje prawdziwe pytanie :)

Czy jest to możliwe z TCompressionStream Delphi z jednostki ZLib?

Odpowiedz

6

Należy użyć deflateSetDictionary. Jest dostępny w Delphi XE2 ZLib.pas, ale klasy strumienia kompresji nie wystawiają pola TZStreamRec na wywołanie go. Pomocnicy klasy mogą uzyskać dostęp do prywatnych pól powiązanej klasy, dzięki czemu można obejść to ograniczenie, dodając je do TCustomZStream (dodanie go do TZCompressionStream nie będzie działać).

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; 

Wystarczy wywołać SetDictionary z ciągiem SPDY natychmiast po utworzeniu strumienia kompresji.