Delphi,FileStream,从第5个字符开始读取

Don*_*ams 0 delphi zlib

我有一个用zlib压缩的tiff图像,但它们在文件的开头粘贴了4个字符的标识符.

我想开始在5位读取文件,跳过前4个字符,然后解压缩.

我修改了以下代码,但当它到达"LOutput.CopyFrom"行时,它告诉我DataError.

procedure TForm1.DecompressXE3 ;
var
  LInput, LOutput: TFileStream;
  LUnZip: TZDecompressionStream;
  FSize : int64 ;
begin
  { Create the Input, Output, and Decompressed streams. }
  LInput := TFileStream.Create(edtDecompressSrcFile.Text, fmOpenRead);

  FSize := LInput.Size ;

  LInput.Position := 5 ;

  LOutput := TFileStream.Create(ChangeFileExt(edtDecompressSrcFile.Text, '.tiff'), fmCreate);


  LUnZip := TZDecompressionStream.Create(LInput);


  { Decompress data. }
  LOutput.CopyFrom(LUnZip, FSize-4 );
//  LOutput.CopyFrom(LUnZip, 0 );

  { Free the streams. }
  LUnZip.Free;
  LInput.Free;
  LOutput.Free;


end;
Run Code Online (Sandbox Code Playgroud)

MBo*_*MBo 5

位置从零开始,因此您必须设置 LInput.Position := 4; 为跳过4个字节.

潜在的错误原因 - TZDecompressionStream可能使用整个输入流,忽略位置设置,因此额外的启动字节会中断解压缩过程.在这种情况下,您最好将文件的有效部分复制到中间MemoryStream,并将其作为TZDecompressionStream.Create的输入参数提供.

并注意您正在使用FSize - 压缩文件的大小 - 从解压缩的流中复制.你应该用

LOutput.CopyFrom(LUnZip, 0);
or
LOutput.CopyFrom(LUnZip, LUnZip.Size);
Run Code Online (Sandbox Code Playgroud)