首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

压缩和解压函数的有关问题

2013-01-02 
压缩和解压函数的问题varfilename:stringbt:TBytesbeginfilename:丰碑SetLength(bt,12) //丰碑压

压缩和解压函数的问题


var
  filename:string;
  bt:TBytes;
begin
filename:='丰碑';
SetLength(bt,12); //'丰碑'压缩后的TBytes
bt[0]:=120;
bt[1]:=1;
bt[2]:=51;
bt[3]:=240;
bt[4]:=155;
bt[5]:=88;
bt[6]:=1;
bt[7]:=0;
bt[8]:=3;
bt[9]:=72;
bt[10]:=1;
bt[11]:=136;
//bt:=ZCompressStr(filename, zcFastest); //压缩
ShowMessage(ZDecompressStr(bt)); //解压
end;

这里都是能够正常压缩和解压的
但是我真正需要用的一些TBytes,是已经压缩过的,需要直接解压,一使用ZDecompressStr函数就报错:data error
数据损坏或者数据不完整!
这个要怎么办??
[解决办法]
对于Unicode支持的时候有可能会因为被解压的源压缩数据比实际的多(实际压缩后得到的是单数字节数),此时就需要对Zlib.pas单元解压过程进行调整
function TDecompressionStream.Read(var Buffer; Count: Longint): Longint;
var
  current,remain: LongInt;
begin
  FZRec.next_out := @Buffer;
  FZRec.avail_out := Count;
  if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
  remain := 0;
  while (FZRec.avail_out > 0) do
  begin
    current := FZRec.avail_in;
    if FZRec.avail_in = remain then
    begin
      FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer));
      if FZRec.avail_in = remain then
      begin
        Result := Count - FZRec.avail_out;
        Exit;
      end;
      FZRec.next_in := FBuffer;
      FStrmPos := FStrm.Position;
      Progress(Self);
    end;
    CCheck(inflate(FZRec, 0));

    if current = FZRec.avail_in then remain := current;
  end;
  Result := Count;
end;

热点排行