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

时间:2015-10-09 18:41:10

标签: 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;

1 个答案:

答案 0 :(得分:5)

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

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

请注意,您正在使用FSize - 压缩文件的大小 - 从解压缩流进行复制。你应该使用

LOutput.CopyFrom(LUnZip, 0);
or
LOutput.CopyFrom(LUnZip, LUnZip.Size);