2012-12-13 42 views
1

我需要將IdCompressZlib組件與CBuilderXE一起使用, 但我沒有找到關於該主題的文檔或示例。 我也做了一些試驗性的嘗試,使用它失敗了。如何在CBuilderXE中使用IdCompressZlib組件

有人可以發表一些關於如何使用這個組件或一些有用的像這樣的話題的例子嗎?

更新: Belowe樣本代碼,我tryed,並給予errore -5時,該方法InflateStream叫做:

int err; 
String Fun = "[TestCompress] ", s1, zipString, strTest = "The 'zlib' compression library provides in-memory compression \ 
and decompression functions, including integrity checks of the uncompressed data. \ 
This version of the library supports only one compression method (deflation) \ 
but other algorithms will be added later and will have the same stream interface. "; 

TStringStream * inpStream = NULL, *outStream = NULL; 
TMemoryStream * stream1 = NULL, *stream2 = NULL; 

stream1 = new TMemoryStream(); 
stream2 = new TMemoryStream(); 

inpStream = new TStringStream(); 
outStream = new TStringStream(); 

inpStream->Clear(); 
inpStream->WriteString(strTest); 
stream1->LoadFromStream(inpStream); 
stream1->Position = 0; 

IdCompressorZLib1->InflateStream(stream1, stream2); 

outStream->Clear(); 
stream2->SaveToStream(outStream); 
zipString = outStream->DataString; 

MyLog(Fun + Format("Compress test: Compress size from [%d] to [%d]", 
     ARRAYOFCONST((strTest.Length(), zipString.Length())))); 
+0

究竟是什麼,你有麻煩?你迄今爲止嘗試過哪些方法不適合你?你想用什麼'TIdCompressorZLib'呢? –

+0

嗨雷米,我的第一個麻煩是缺乏有關組件的文檔,所以一個例子可以給我很多幫助。 我做了一些簡單的測試,以壓縮流內的字符串。 – enzo2

+0

最後一次嘗試是以下情況,當我調用InflateStream方法時,總會出現錯誤Z_DATA_ERROR(-3)。 – enzo2

回答

1

不能解壓一個簡單的字符串!
錯誤:(-5)InflateStream看起來第一個字節必須是:zlib: 78 01 or 78 9C or 78 DA
錯誤:(-3)InflateStream找到第一個字節(78 01)但長度不匹配。
在strTest中,第一個字節是「Th」。

用下面的代碼(與RAD 2010 Indy10測試)

void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 

String strTest = "The 'zlib' compression library provides in-memory compression \ 
and decompression functions, including integrity checks of the uncompressed data. \ 
This version of the library supports only one compression method (deflation) \ 
but other algorithms will be added later and will have the same stream interface. "; 

TStringStream * inpStream = NULL; 
TMemoryStream * stream1 = NULL, *stream2 = NULL, *stream3 = NULL; 

stream1 = new TMemoryStream(); 
stream2 = new TMemoryStream(); 
stream3 = new TMemoryStream(); 

inpStream = new TStringStream(); 


inpStream->Clear(); 
inpStream->WriteString(strTest); 
stream1->LoadFromStream(inpStream); 
stream1->Position = 0; 

// first compress stream1 with Level 1 
IdCompressorZLib1->DeflateStream(stream1,stream2,1); 

stream2->SaveToFile("test.dat"); 
stream3->LoadFromFile("test.dat"); 
stream2->Position = 0; 
// Now decompress stream3 
IdCompressorZLib1->InflateStream(stream3,stream2); 
stream2->SaveToFile("test2.dat"); 

} 

嘗試運行程序後有2個文件在debug文件夾TEST.DATtest2.dat

test.dat幾個字節(大小190)

xUQnÃ0C¯Â¿¶@× ... (Hex 78 01 55 8F 51 6E C3 ...) 

test2.dat幾個字節(大小306 )

The 'zlib' compression library provides in-memory compression and dec ... 
+0

你是對的moskito。我以錯誤的順序使用了「充氣和放氣」功能。缺乏手冊導致對功能意義的錯誤解讀。坦克。 – enzo2

+0

很樂意幫忙。感謝您的答覆 –

0

Belowe你會發現工作樣例 感謝大家的建議

void __fastcall TFormMain::btnTestIdCompressClick(TObject * Sender) 
{ 
    int err; 
    String Fun = "[TestIdCompress] ", s1, zipString, strTest = "The 'zlib' compression library provides in-memory compression \ 
    and decompression functions, including integrity checks of the uncompressed data. \ 
    This version of the library supports only one compression method (deflation) \ 
    but other algorithms will be added later and will have the same stream interface. "; 

    TStringStream * inpStream = NULL, *outStream = NULL; 
    TMemoryStream * stream1 = NULL, *stream2 = NULL; 

    try 
    { 
     MyLog("--------------------------------------"); 
     MyLog(Fun + Format("Original msg : size=[%d] data=[%s]", ARRAYOFCONST((strTest.Length(), strTest)))); 

     stream1 = new TMemoryStream(); 
     stream2 = new TMemoryStream(); 

     inpStream = new TStringStream(); 
     outStream = new TStringStream(); 

     inpStream->Clear(); 
     inpStream->WriteString(strTest); 
     stream1->LoadFromStream(inpStream); 
     stream1->Position = 0; 

     IdCompressorZLib1->DeflateStream(stream1, stream2, 1); 

     outStream->Clear(); 
     stream2->SaveToStream(outStream); 
     zipString = outStream->DataString; 

     MyLog("--------------------------------------"); 
     MyLog(Fun + Format("Compressed msg : size=[%d] data=[%s]", ARRAYOFCONST((zipString.Length(), zipString)))); 

     inpStream->Clear(); 
     inpStream->WriteString(zipString); 
     stream1->LoadFromStream(inpStream); 
     stream1->Position = 0; 

     stream2->Position = 0; 
     // Now decompress stream3 
     IdCompressorZLib1->InflateStream(stream1, stream2); 
     outStream->Clear(); 
     stream2->SaveToStream(outStream); 
     s1 = outStream->DataString; 
     MyLog("--------------------------------------"); 
     MyLog(Fun + Format("Decompressed msg : size=[%d] data=[%s]", ARRAYOFCONST((s1.Length(), s1)))); 

    } 
    __finally 
    { 
     if (stream1) 
     { 
      stream1->Clear(); 
      delete stream1; 
      stream1 = NULL; 
     } 
     if (stream2) 
     { 
      stream2->Clear(); 
      delete stream2; 
      stream2 = NULL; 
     } 
     if (inpStream) 
     { 
      inpStream->Clear(); 
      delete inpStream; 
      inpStream = NULL; 
     } 
     if (outStream) 
     { 
      outStream->Clear(); 
      delete outStream; 
      outStream = NULL; 
     } 
    } 

} 
相關問題