为什么TStringStream.Bytes与'TStream.Read'的不同之处

SOU*_*ser 1 delphi byte stringstream

使用TStringStream时,bytes使用其Bytes属性与bytes提取的使用不同TStream.Read.如下所示:

  1. 所述bytes使用所提取的TStream.Read表示正确的数据.
  2. bytes使用它的Bytes属性包含更多的数据.(正确的最后一个字节与错误的字节bytes不同bytes)

你能帮忙评论可能的原因吗?非常感谢您的帮助!

PS:Delphi XE,Windows 7.(似乎在Delphi 7中的TStringStream没有LoadFromFile或SaveToFile.)

PS:可以从SkyDrive下载示例文件:REF_EncodedSample和REF_DecodedSample.(Zlib压缩的图像文件.).

procedure CompareBytes_2;
var
  ss_1: TStringStream;
  ss_2: TStringStream;
  sbytes_Read: TBytes;
  sbytes_Property: TBytes;
  len_sbytes_Read: Integer;
  len_sbytes_Property: Integer;
  filename: string;
begin
  filename := 'REF_EncodedSample';  // textual data
//  filename := 'REF_DecodedSample';  // non-textual data

  ss_1 := TStringStream.Create;
  ss_1.LoadFromFile(filename);
  ss_2 := TStringStream.Create;
  ss_2.LoadFromFile(filename);

  ss_1.SaveToFile(filename+ '_CopyByStringStream_1');
  ss_2.SaveToFile(filename+ '_CopyByStringStream_2');

  len_sbytes_Read := ss_1.Size;
  SetLength(sbytes_Read, len_sbytes_Read);
  ss_1.Read(sbytes_Read[0], len_sbytes_Read);

  sbytes_Property := ss_2.Bytes;

  ShowMessage(
    BoolToStr(
      Length(sbytes_Read) = Length(sbytes_Property),
      True));

  ShowMessage(
    BoolToStr(
      sbytes_Read[len_sbytes_Read - 1] = sbytes_Property[len_sbytes_Read - 1],
      True));

  ss_1.Free;
  ss_2.Free;
end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

字符串流文档说明:

Bytes属性返回存储数据的缓冲区.使用Size属性查找缓冲区中的实际数据量.

据推测,缓冲区已被分配以容纳比实际需要更多的空间.只有缓冲区的第一个Size字节包含有效内容.


此外,调用ss_1.Read有点无意义,因为在调用SetLength之后Length(sbytes_Read)没有改变.从流中读取时,您将使用ReadBuffer而不是Read.同样适用于WriteBuffer.