2012-12-13 41 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; 
     } 
    } 

} 
相关问题