读书人

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

发布时间: 2013-01-02 13:08:44 作者: rapoo

压缩和解压函数的问题


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;

读书人网 >.NET

热点推荐