加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 为什么在使用readbuffer时使用string [1]而不是string

发布时间:2020-12-15 09:42:59 所属栏目:大数据 来源:网络整理
导读:我有这样的记录 TEmf_SrectchDIBits = packed record rEMF_STRETCHDI_BITS: TEMRStretchDIBits; rBitmapInfo: TBitmapInfo; ImageSource: string; end; --- --- RecordData: TEmf_SrectchDIBits; 如果我正在使用TStream将数据读入其中,则会发生异常 SetLengt
我有这样的记录

TEmf_SrectchDIBits = packed record
    rEMF_STRETCHDI_BITS: TEMRStretchDIBits;
    rBitmapInfo: TBitmapInfo;
    ImageSource: string;
  end;
  ---
  ---
  RecordData: TEmf_SrectchDIBits;

如果我正在使用TStream将数据读入其中,则会发生异常

SetLength(RecordData.ImageSource,pRecordSize);

EMFStream.ReadBuffer(RecordData.ImageSource,pRecordSize)

但如果我使用下面的代码,它正常工作

SetLength(RecordData.ImageSource,pRecordSize);

EMFStream.ReadBuffer(RecordData.ImageSource[1],pRecordSize);

那么使用String和String有什么区别[1]

解决方法

区别在于与.ReadBuffer方法的签名相关的详细信息.

签名是:

procedure ReadBuffer(var Buffer; Count: Longint);

如您所见,Buffer参数没有类型.在这种情况下,您说要访问底层变量.

但是,字符串是两部分,一个指针(变量的内容)和字符串(变量指向此).

因此,如果ReadBuffer只给出了字符串变量,它将有4个字节来存储数据,字符串变量,并且由于字符串变量应该保存指针而不是任何随机二进制数据,因此不会很好用. .如果ReadBuffer写入超过4个字节,它将用新数据覆盖内存中的其他内容,这可能是一个灾难性的操作.

通过将[1]字符传递给var参数,您可以使用ReadBuffer访问字符串变量指向的数据,这就是您想要的.你想要改变字符串内容.

此外,请确保您已将字符串变量的长度设置为足以容纳您正在读取的内容.

另外,最后一点,我无法验证.在较旧的Delphi版本中,字符串变量包含1个字节的字符.在较新的情况下,由于unicode,我认为它们是两个,因此代码可能无法在较新版本的Delphi中按预期工作.您可能希望使用字节数组或堆内存.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读