代码之家  ›  专栏  ›  技术社区  ›  Wodzu

Delphi 10.2中对MemoryStream的写入发生了怎样的变化?

  •  2
  • Wodzu  · 技术社区  · 7 年前

    我正在将代码从10.1移植到10.2,这给了我一个错误:

    procedure TForm4.FormCreate(Sender: TObject);
    const
      CFourBytes: array[0..3] of Byte = (1, 2, 3, 4);
    var
      LStream: TMemoryStream;
      LBuffer: array of Byte;
    begin
      SetLength(LBuffer, 4);
      LStream := TMemoryStream.Create;
      LStream.Write(@CFourBytes[0], 4); // E2036 Variable required
    
      LStream.Position := 0;
      LStream.ReadData(@LBuffer[0], 4);
    end;
    

    LStream.Write(CFourBytes[0], 4);

    2 回复  |  直到 7 年前
        1
  •  3
  •   David Heffernan    7 年前

    旧版本中发生的事情很奇怪。编译器在中选择此重载 TStream

    function Write(const Buffer: TBytes; Count: Longint): Longint; overload;
    

    CFourBytes TBytes 对象

    现在正好有一个 T字节 变量是数组第一个元素的地址。而在这个世界上什么都没有 覆盖 TMemoryStream.Write Length() T字节 对象因此,您的代码恰好按预期工作。这显然是一个已经修复的编译器错误。

    你的密码一直被破解,到目前为止,你只是侥幸逃脱了。你应该修改你的代码。这样地:

    LStream := TMemoryStream.Create;
    try
      LStream.WriteBuffer(CFourBytes, SizeOf(CFourBytes));
    
      SetLength(LBuffer, LStream.Size);
      LStream.Position := 0;
      LStream.ReadBuffer(LBuffer[0], LStream.Size);
    finally
      LStream.Free;
    end;
    

    请注意,我正在使用 WriteBuffer ReadBuffer 而不是 Write Read TStream . 原因是它们执行错误检查,并在出现错误时引发异常,这与 .

        2
  •  1
  •   MBo    7 年前

    也许什么都没有改变。

    TStream.Write/Read const/var 参数 const Buffer help )使用变量的地址是错误的(因为方法(确切地说是编译器)会找到变量本身的地址)。

    可能您不小心将这些方法与读/写混淆了 使用 打字 overloaded versions 得到 Pointer

    在这里 ReadData 实现取消引用此指针并使用 Read 内部( 阅读 依次调用 Move