在实际编程中,经常会用到Buffer,当string作为Buffer传值时需要注意的是

1, string的值的起始索引是1,千万记住!

2, 有时候需要先告诉系统去开辟出内存空间,用SetLength函数。

如下代码,示范了再Move、 WriteBuffer、 ReadBuffer时候的用法:

  1. unit Unit3;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, StdCtrls;
  6. type
  7. TForm3 = class(TForm)
  8. Memo1: TMemo;
  9. Button1: TButton;
  10. Button2: TButton;
  11. Button3: TButton;
  12. Button4: TButton;
  13. procedure Button1Click(Sender: TObject);
  14. procedure Button2Click(Sender: TObject);
  15. procedure FormCreate(Sender: TObject);
  16. procedure FormDestroy(Sender: TObject);
  17. procedure Button3Click(Sender: TObject);
  18. procedure Button4Click(Sender: TObject);
  19. private
  20. { Private declarations }
  21. FMemoryStream: TMemoryStream;
  22. FBuffer: string;
  23. public
  24. { Public declarations }
  25. end;
  26. var
  27. Form3: TForm3;
  28. implementation
  29. {$R *.dfm}
  30. procedure TForm3.Button1Click(Sender: TObject);
  31. var
  32. LStr: string;
  33. LLen: Integer;
  34. begin
  35. LStr := '太棒了!Hello, 世界 我太爱你了';
  36. LLen := Length(LStr);
  37. FMemoryStream.WriteBuffer(LLen, SizeOf(LLen));
  38. // 要用LStr[1], 而不是LStr
  39. FMemoryStream.WriteBuffer(LStr[1], LLen);
  40. end;
  41. procedure TForm3.Button2Click(Sender: TObject);
  42. var
  43. LStr: string;
  44. LLen: Integer;
  45. begin
  46. // 因为写入与读出在一个工程中,所以先把指针指向开头位置
  47. FMemoryStream.Position := 0;
  48. FMemoryStream.ReadBuffer(LLen, SizeOf(LLen));
  49. SetLength(LStr, LLen);
  50. // 要用LStr[1], 而不是LStr
  51. FMemoryStream.ReadBuffer(LStr[1], LLen);
  52. Memo1.Lines.Add(LStr);
  53. end;
  54. procedure TForm3.Button3Click(Sender: TObject);
  55. var
  56. LStr: string;
  57. LLen: Integer;
  58. LIndex: Integer;
  59. begin
  60. LStr := '世界很美好 Hello, World!';
  61. LLen := Length(LStr);
  62. // 先为FBuffer开辟出空间
  63. SetLength(FBuffer, SizeOf(LLen) + LLen);
  64. LIndex := 1;
  65. // FBuffer的起始位置为1
  66. Move(LLen, FBuffer[1], SizeOf(LLen));
  67. // 计算Buffer指针的移动位置
  68. Inc(LIndex, SizeOf(LLen));
  69. // 要用LStr[1], 而不是LStr
  70. Move(LStr[1], FBuffer[LIndex], LLen);
  71. end;
  72. procedure TForm3.Button4Click(Sender: TObject);
  73. var
  74. LStr: string;
  75. LLen: Integer;
  76. LIndex: Integer;
  77. begin
  78. LIndex := 1;
  79. Move(FBuffer[1], LLen, SizeOf(LLen));
  80. Inc(LIndex, SizeOf(LLen));
  81. SetLength(LStr, LLen);
  82. // 要用LStr[1], 而不是LStr
  83. Move(FBuffer[LIndex], LStr[1], LLen);
  84. Memo1.Lines.Add(LStr);
  85. end;
  86. procedure TForm3.FormCreate(Sender: TObject);
  87. begin
  88. FMemoryStream := TMemoryStream.Create;
  89. end;
  90. procedure TForm3.FormDestroy(Sender: TObject);
  91. begin
  92. FMemoryStream.Free;
  93. end;
  94. end.

http://blog.csdn.net/procedure1984/article/details/5419454

Move WriteBuffer ReadBuffer String的更多相关文章

  1. SQL Server ->> Move characters in string N position(s) forward/backward based on ASCII table(根据ASCII表的排列顺序将字符串内的数值往前或者后移N个位)

    去年无聊的时候想到想玩一下根据ASCII表的排列顺序将字符串内的数值往前或者后移N个位,顺便看一下是T-SQL性能好还是用C#写CLR函数处理得快.结果是在50万行以下其实两者差距很小,当然这是在我的 ...

  2. java移动/赋值文件 copy/move file

    public class FileAccess { public static boolean Move(File srcFile, String destPath) { // Destination ...

  3. C++ 11 右值引用以及std::move

    转载请注明出处:http://blog.csdn.net/luotuo44/article/details/46779063 新类型: int和int&是什么?都是类型.int是整数类型,in ...

  4. move.js运动插件

    move.js 运动插件是一款针对元素动画效果的插件.可以运用此插件制作出各类元素效果. 插件GitHub地址:https://github.com/visionmedia/move.js 下面整理学 ...

  5. Add GUI to connect to SQL

    (*********************************************************************************) (* *) (* Below i ...

  6. 【Zookeeper】源码之序列化

    一.前言 在完成了前面的理论学习后,现在可以从源码角度来解析Zookeeper的细节,首先笔者想从序列化入手,因为在网络通信.数据存储中都用到了序列化,下面开始分析. 二.序列化 序列化主要在zook ...

  7. 从零讲解搭建一个NIO消息服务端

    本文首发于本博客,如需转载,请申明出处. 假设 假设你已经了解并实现过了一些OIO消息服务端,并对异步消息服务端更有兴趣,那么本文或许能带你更好的入门,并了解JDK部分源码的关系流程,正如题目所说,笔 ...

  8. 理解Java的NIO

    同步与阻塞 同步和异步是针对应用程序和内核的交互而言的. 同步:执行一个操作之后,进程触发IO操作并等待(阻塞)或者轮询的去查看IO的操作(非阻塞)是否完成,等待结果,然后才继续执行后续的操作. 异步 ...

  9. Java NIO之Selector(选择器)

    历史回顾: Java NIO 概览 Java NIO 之 Buffer(缓冲区) Java NIO 之 Channel(通道) 其他高赞文章: 面试中关于Redis的问题看这篇就够了 一文轻松搞懂re ...

随机推荐

  1. SQL学习之Insert的特殊用法(插入检索出的数据,表之间的数据复制)

    1.插入检索出的数据 select * from dbo.Customers_1

  2. 读书笔记 - 设计模式(Head First)

    设计模式让你和其他开发人员之间有共享的词汇,设计模式可以把你的思考架构的层次提高到模式层面,而不是停留在琐碎的对象上. 设计原则: 封装变化:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需 ...

  3. jsf小例子

    有人问我用过jsf没?   当时没有用过,就看了一下: 写了一个小例子  JSF和struts2 差不多的,都有一些配置和跳转 struts2的action配置和JSF的faces-config.xm ...

  4. ubuntu下浏览器调用本地应用程序

    ubunut下浏览器调用本地应用程序需要desktop文件和scheme协议的支持,和windows 的url protocol类似,只是注册协议的方式不一样. 首先是desktop文件,里面需要加入 ...

  5. math。h中的log函数的应用

    以10为底的log函数: 形式为 double  log10(double  x) 以e为底的log函数(即 ln)double log (double x) 如何表达log 以a为底b的对数: 用换 ...

  6. Hibernate学习之关系映射(转)

    一.一对多 "一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系.一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多.多对一:从订单的角度来说多个订单可以对应一 ...

  7. JavaScriptの例

    Dateのオブジェクト: <html> <head> <title>Date Object Example</title> </head> ...

  8. JS中的this都有什么作用?

    1.全局代码中的this  是指向全局对象,在浏览器中是window alert(this) //window 2.作为单纯的函数调用: function fooCoder(x) { this.x = ...

  9. codeforces 603C. Lieges of Legendre sg函数

    题目链接 n堆石子, 可以拿走一堆中的一颗, 或者将一堆数量为2*x的石子分为k堆x个的石子.k由题目给出. k分奇偶讨论. k为偶数时,k堆x个的石子异或结果为0: k为奇数时, k堆x个石子异或结 ...

  10. 实验时css层叠样式表不更新的情况

    自定义了CSS的样式,希望在页面中起作用.因为MVC中Views/Shared/_Layout.cshtml是所有视图的公共文件,如下: <!DOCTYPE html> <html& ...