1:压缩字符串并写入文件(其中用VCLUnZip解压字符串正常)
function TFMainForm.WriteZipRes(FileHandle: Integer; FileName: String): Integer;
var
  Offset: Integer;
  StrList: TStringList;
  AnsiStr: String;
  UnicodeStr: WideString;
  CompStr: String;
  Ms: TMemoryStream;
  Size: Integer;
  //DecompStr: String;
begin
  Offset := 0;
  StrList := TStringList.Create;
  Ms := TMemoryStream.Create;
  try
    StrList.LoadFromFile(FileName);    // trans to unicode
    AnsiStr := StrList.Text;
    UnicodeStr := WideString(AnsiStr);    // compress
    CompStr := VCLZip.ZLibCompressStr(UnicodeStr);
    // decompress
    //DecompStr := VCLUnZip.ZLibDecompressString(CompStr);    // write to stream
    Size := Length(CompStr);
    Ms.Write(PChar(CompStr)^, Size);    Offset := Offset + FileWrite(FileHandle, Ms.Memory^, Size);
  finally
    StrList.Free;
    Ms.Free;
  end;  Result := Offset;
end;2:读文件中压缩的该区域,但是VCLUnZip.ZLibDecompressString报错
var
    BinSize: Integer;
    BinData: PChar;
try
        BinSize := ResourceDataArr[i].Size;// 压缩后的长度
        BinData := PChar(AllocMem(BinSize+1));        FileSeek(FFileHandle, ResourceDataArr[i].Offset, 0);// seek到位置
        FileRead(FFileHandle, BinData^, BinSize);// 读取        DeCompStr := VCLUnZip.ZLibDecompressString(BinData);//出错        DeCompUnicodeStr := WideString(BinData);
        ShowMessage(DeCompUnicodeStr);
      finally
        FreeMem(BinData);
      end;这样的方法是用不压缩的字符串时可以正常的,压缩后就不正常,感觉是读取的字符串的后半部分没有了,但长度是对的,不知道是什么回事?

解决方案 »

  1.   

    问题解决了,压缩没有问题,问题在PChar转String。
    直接的PChar赋值给String,确实是将PChar指向的内容Copy给String了,但是String会将\0识别为结束符,因为是压缩的字符串,肯定会有这样的字符,所以必须使用Move方式,将PChar地址的内容手工复制到String的地址中,如下:
    SetLength(CompStr, BinSize);
    Move(BinData^, CompStr[1], BinSize);
    这样就不会有任何字符的遗漏了。
      

  2.   

    内容压缩还是直接指针操作的好少用sring
      

  3.   

    呵呵,我是说咯,我都用VCLZIP几年了,也没有见到过BUG.呵呵.
      

  4.   

    用delphi7.0以上自带的zlib,不好吗?