有关TMemoryStream的Write
来源:互联网 发布:unity3d 获取物体坐标 编辑:程序博客网 时间:2024/04/30 19:45
还是做点笔记,否则老忘,重复劳动。
使用TMemoryStream的Write方法时如果直接使用string作为参数,会出现莫名其妙的问题,Write方法实际把另一块不知道哪里冒出来的内存中的内容复制到了Stream的Memory里。假设lStr的地址为1,执行以下语句:
AStream.Write(lStr,Length(lStr) + 1);
Write方法实际执行时会把内存中自地址100起Length(lStr) + 1字节的内容写到AStream的Memory中。
Write方法的原型
function TMemoryStream.Write(const Buffer; Count: Longint): Longint;
经调试发现原因是这样的:
string类型实际为一个指针,其中存放了字符串存放的实际地址(其实这个早就知道,用的时候想当然了,所以导致现在的问题)。
结果就是,如果直接使用lStr变量,那么Write的Buffer参数获取的是lStr变量,它和lStr占用同一个4字节的内存空间,存放实际字符串的地址,如果Write方法知道这是个string类型,当然就没什么问题,可以强制进行转换,问题是,Write方法认为buffer中就存放着需要写到流中的内容,那就麻烦了,调试时看到的地址100其实就是变量lStr的地址,而1是字符串的真实地址。
正确的调用方法是:
AStream.Write(PChar(lStr)^, Length(lStr) + 1);
或者
AStream.Write(Pointer(lStr)^, Length(lStr) + 1);
这保证了Buffer就是实际字符串所在的内存区域。
此外,发现string在内存中也是用0作为结束符的,这和以前知道的不太一样,如果这样的话,不就和PChar统一起来了吗,也就不必区分null-terminated string和一般的delphi string。(怪里怪气的)
- 有关TMemoryStream的Write
- 有关流变量TMemoryStream
- 对TMemoryStream的一些改进(Tmemorystream copyFrom)
- TMemoryStream 的操作
- 对TMemoryStream的一些改进
- 对TMemoryStream的一些改进
- 对TMemoryStream的一些改进
- 有关JS的document.write()的种种
- TMemoryStream下关于bye数组的操作
- 有关BinaryWriter.Write 方法学习
- Delphi:TMemoryStream类--二进制大对象与数据库的交互
- Delphi:TMemoryStream类--二进制大对象与数据库的交互
- 关于 Delphi 中流的使用(1) 用 TMemoryStream(内存流) 入门
- 关于 Delphi 中流的使用(1) 用 TMemoryStream(内存流) 入门
- 关于 Delphi 中流的使用(1) 用 TMemoryStream(内存流) 入门
- 关于 Delphi 中流的使用(1) 用 TMemoryStream(内存流) 入门
- delphi TMemoryStream对象用法
- delphi TMemoryStream对象用法
- 加固MySQL
- c#中使用nunit支持数据库单元测试
- 我的联系邮箱
- 开张大吉
- 这几天就这样了。。。
- 有关TMemoryStream的Write
- 昨日关注:SQL Server 索引结构及其使用
- Windows下的J2EE1.4的EJB部属
- PowerBuilder 8/9 与 SCC的集成(1)
- 初识A*算法
- 纯(信任)局域网中互联网的方法WINXPSP2适用
- matlab的Virtual Reality(虚拟现实)工具箱的应用简介
- 春去夏来,三级四级
- matlab的stateflow(状态流)简单应用--做一个计数器