gpt4 book ai didi

delphi - 为什么 TStringStream.Bytes 与从 'TStream.Read' 获取的内容不同

转载 作者:行者123 更新时间:2023-12-01 21:32:52 28 4
gpt4 key购买 nike

对于 TStringStream,使用其 Bytes 属性的 bytes 与使用 TStream.Read 提取的 bytes 不同。如下图:

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

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

PS:Delphi XE、Windows 7。(Delphi 7 中的 TStringStream 似乎没有 LoadFromFile 或 SaveToFile。)

PS:示例文件可以从网盘下载: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;

最佳答案

字符串流documentation状态:

The Bytes property returns the buffer in which the data is stored. Use the Size property to find the actual amount of data in the buffer.

推测缓冲区已被分配以容纳比实际需要更多的空间。仅缓冲区的前 Size 字节包含有效内容。

<小时/>

此外,对 ss_1.Read 的调用有点毫无意义,因为在调用 SetLength 后 Length(sbytes_Read) 不会改变。当从流中读取时,您将使用 ReadBuffer 而不是 Read。 WriteBuffer 同样如此。

关于delphi - 为什么 TStringStream.Bytes 与从 'TStream.Read' 获取的内容不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11353069/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com