2013-10-04 1 views
6

TIdComproessorZLib 구성 요소는 Delphi/C++ Builder Indy 라이브러리에서 압축 및 압축 해제에 사용됩니다. CompressStream 방법은 다음과 같이 정의되어있다Indy의 TIdCompressorZLib.CompressStream 메서드에 대한 매개 변수는 어디에 문서화되어 있습니까?

public: virtual __fastcall CompressStream(TStream AInStream, TStream AOutStream, const TIdCompressionLevel ALevel, const int AWindowBits, const int AMemLevel, const int AStrategy); 

도움말 파일에서 이러한 매개 변수의 완전한 설명은 다음과 같습니다

CompressStream 공개 오버라이드 (override) 절차입니다. 조상 클래스에서 선언 된 가상 메서드를 추상화하는 을 구현합니다.

AInStream은 압축 작업에서 에 사용 된 압축되지 않은 내용을 포함하는 스트림입니다.

AOutStream은 압축 작업 에서 압축 된 내용을 저장하는 데 사용되는 스트림입니다. AOutStream은 작업에서 압축 된 내용을 출력하기 전에 지워집니다. AOutStream이 인 경우 AInStream의 스트림이 지워지고 압축 작업에서 출력 으로 재사용됩니다.

ALevel을 사용하여 작업의 원하는 압축 수준을 나타냅니다.

AWLowsowsBits 및 AMemLevel을 사용하여 ZLib 라이브러리를 사용하여 메모리 내 압축을 수행하는 데 필요한 메모리 풋 프린트 을 제어합니다.

압축 작업 에서 사용되는 RLE 인코딩 전략을 제어하려면 AStrategy를 사용하십시오.

ALevel의 값은 TIdCompressionLevel에 대한 도움말 페이지에 정의,하지만 난 값을 그냥 정수 AWindowBits, AMemLevel, 또는 AStrategy에 사용되어야 하는지를의 표시를 찾을 수 없습니다.

나는 소스 코드에서 보았지만로 도움말 파일에 나열되어 IndyCompressStream에 CompressStream 단지 대표 :

IndyCompressStream(TStream InStream, TStream OutStream, const int level = Z_DEFAULT_COMPRESSION, const int WinBits = MAX_WBITS, const int MemLevel = MAX_MEM_LEVEL, const int Stratagy = Z_DEFAULT_STRATEGY); 

IndyCompressStream의 도움도 매개 변수의 최소한의 설명을 나열하지 않습니다 CompressStream 않습니다.

나는 IndyCompressStream에 언급 된 (내가 생각하는) 그 기본 상수, 소스 \ Indy10을 \ 프로토콜 \ IdZLibHeaders.pas을 살고있는 파일을 추적, 그들은 Z_DEFAULT_COMPRESSION에 주어진 값이, 그러나

Z_DEFAULT_STRATEGY = 0; 
    Z_DEFAULT_COMPRESSION = -1; 
    MAX_WBITS = 15; { 32K LZ77 window } 
    MAX_MEM_LEVEL = 9; 

입니다 TIdCompressionLevel

이 구성 요소에 대해 AWindowBits, AMemLevel 및 AStrategy가 의미하는 바에 대한 문서가 있으며 그 값은 어떤 값이 적당합니까? 위에 나열된 값이 실제로 권장되는 기본값입니까? 또한 소스 파일에는 "indy", "Indy10"및 "indyimpl"디렉토리가 포함됩니다. 현재 Indy 구성 요소의 소스를 찾기 위해 이들 중 어느 것을 사용해야합니까?

감사합니다.

+1

이제는 질문하는 방법입니다. 잘 했어. –

+0

무엇을하고 싶습니까? –

+0

인디에는 문서가 있습니까? –

답변

4

zlib.h에서 zlib 설명서를 찾아야합니다.특히, parameters to deflateInit2().

거의 모든 경우에 혼란스러운 것은 압축 수준과 창 비트뿐입니다. 창 비트의 경우 일반적으로 창 크기를 32K (15)로두고 gzip 형식 (31)의 경우 16을 추가하거나 헤더 나 트레일러가없는 원시 압축 형식을 얻으려면 부정 (-15)하십시오. 특별한 종류의 데이터의 경우 다른 압축 전략으로 개선 할 수 있습니다 (예 : 이미지 또는 다른 수치 적 데이터 배열.

+0

zlib의 저자 중 한 명을 제 질문에 대답하는 것과 같은 것이 없습니다! 감사! 필자가 변경해야 할 한 가지는 gzip 형식을 만들려고했기 때문입니다. 그 이유는 그것이 내 서버가 기대했던 것이며, deflateInit2()에 대해 zlib 참조에 문서화되어있는 것처럼 windowBits에 16을 추가해야한다는 것입니다. – nachbar

+0

아, 그래, 종종 그 사람도 혼란 스럽다. 나는 대답을 고쳐 줄 것이다. –

3

의견과 답변, 특히 Remy와 Mark에 감사드립니다. Indy 유닛이 zlib 주위의 래퍼 였고 매개 변수가 zlib 라이브러리에 정의되어 있다는 것을 알지 못했습니다.

gzip을 기대하는 서버에 업로드하기 위해 gzip 형식 스트림을 만들려고했습니다. 여기

가 GZIP 압축 및 압축 해제를위한 작동 코드이다 : 특히

void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 
TStringStream* streamIn = new TStringStream(String("This is some data to compress")); 
TMemoryStream* streamCompressed = new TMemoryStream; 
TStringStream* streamOut = new TStringStream; 

/* this also works to compress to gzip format, but you must #include <IdZlib.hpp> 
CompressStreamEx(streamIn, streamCompressed, Idzlib::clDefault, zsGZip); */ 

// NOTE: according to docs, you can leave outstream null, and instream 
// will be replaced and reused, but I could not get that to work 

IdCompressorZLib1->CompressStream(    
    streamIn,   // System::Classes::TStream* AInStream, 
    streamCompressed, // System::Classes::TStream* AOutStream, 
    1,     // const Idzlibcompressorbase::TIdCompressionLevel ALevel, 
    15 + 16,    // const int AWindowBits, -- add 16 to get gzip format 
    8,     // const int AMemLevel, -- see note below 
    0);     // const int AStrategy); 

    streamCompressed->Position = 0; 
    IdCompressorZLib1->DecompressGZipStream(streamCompressed, streamOut); 

    String out = streamOut->DataString; 
    ShowMessage(out); 
} 

그 통과 -1 참고 ALevel은 ZLIB 오류 -2 생산을 위해, 디폴트에도 불구하고, 유효하지 않은 파라미터를 의미 Z_STREAM_ERROR I 발견했다. 또한 AWindowBits의 범위는 일반적으로 8에서 15이지만 16을 추가하면 gzip 형식이되고 음수는 zlib 라이브러리 작성자 인 Mark Adler가 참조한 zlib 설명서에 설명 된대로 원시 형식을 제공합니다. Mark Adler의 의견에 따라 AMemLevel이 Indy의 기본값에서 변경되었습니다.

또한 위에서 언급 한 것처럼 CompressStreamEx 함수는 위의 주석에 포함 된 매개 변수를 사용하여 gzip 압축을 생성합니다.

위의 내용은 RAD Studio XE3에서 테스트되었습니다. 도와 주셔서 다시 한 번 감사드립니다!

+0

'memLevel'을 기본값 인 8로두면 보통 허프만 코드를 데이터에 더 자주 적용함으로써 더 나은 압축이됩니다. –

+0

감사합니다. 위의 코드를 반영하도록 코드를 수정했으며 RAD Studio XE3에서 다시 테스트했습니다. – nachbar

관련 문제