delphi – 为什么在使用readbuffer时使用string [1]而不是string
我有这样的记录
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中按预期工作.您可能希望使用字节数组或堆内存. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |