Move WriteBuffer ReadBuffer String
在实际编程中,经常会用到Buffer,当string作为Buffer传值时需要注意的是
1, string的值的起始索引是1,千万记住!
2, 有时候需要先告诉系统去开辟出内存空间,用SetLength函数。
如下代码,示范了再Move、 WriteBuffer、 ReadBuffer时候的用法:
- unit Unit3;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls;
- type
- TForm3 = class(TForm)
- Memo1: TMemo;
- Button1: TButton;
- Button2: TButton;
- Button3: TButton;
- Button4: TButton;
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- procedure Button3Click(Sender: TObject);
- procedure Button4Click(Sender: TObject);
- private
- { Private declarations }
- FMemoryStream: TMemoryStream;
- FBuffer: string;
- public
- { Public declarations }
- end;
- var
- Form3: TForm3;
- implementation
- {$R *.dfm}
- procedure TForm3.Button1Click(Sender: TObject);
- var
- LStr: string;
- LLen: Integer;
- begin
- LStr := '太棒了!Hello, 世界 我太爱你了';
- LLen := Length(LStr);
- FMemoryStream.WriteBuffer(LLen, SizeOf(LLen));
- // 要用LStr[1], 而不是LStr
- FMemoryStream.WriteBuffer(LStr[1], LLen);
- end;
- procedure TForm3.Button2Click(Sender: TObject);
- var
- LStr: string;
- LLen: Integer;
- begin
- // 因为写入与读出在一个工程中,所以先把指针指向开头位置
- FMemoryStream.Position := 0;
- FMemoryStream.ReadBuffer(LLen, SizeOf(LLen));
- SetLength(LStr, LLen);
- // 要用LStr[1], 而不是LStr
- FMemoryStream.ReadBuffer(LStr[1], LLen);
- Memo1.Lines.Add(LStr);
- end;
- procedure TForm3.Button3Click(Sender: TObject);
- var
- LStr: string;
- LLen: Integer;
- LIndex: Integer;
- begin
- LStr := '世界很美好 Hello, World!';
- LLen := Length(LStr);
- // 先为FBuffer开辟出空间
- SetLength(FBuffer, SizeOf(LLen) + LLen);
- LIndex := 1;
- // FBuffer的起始位置为1
- Move(LLen, FBuffer[1], SizeOf(LLen));
- // 计算Buffer指针的移动位置
- Inc(LIndex, SizeOf(LLen));
- // 要用LStr[1], 而不是LStr
- Move(LStr[1], FBuffer[LIndex], LLen);
- end;
- procedure TForm3.Button4Click(Sender: TObject);
- var
- LStr: string;
- LLen: Integer;
- LIndex: Integer;
- begin
- LIndex := 1;
- Move(FBuffer[1], LLen, SizeOf(LLen));
- Inc(LIndex, SizeOf(LLen));
- SetLength(LStr, LLen);
- // 要用LStr[1], 而不是LStr
- Move(FBuffer[LIndex], LStr[1], LLen);
- Memo1.Lines.Add(LStr);
- end;
- procedure TForm3.FormCreate(Sender: TObject);
- begin
- FMemoryStream := TMemoryStream.Create;
- end;
- procedure TForm3.FormDestroy(Sender: TObject);
- begin
- FMemoryStream.Free;
- end;
- end.
http://blog.csdn.net/procedure1984/article/details/5419454
Move WriteBuffer ReadBuffer String的更多相关文章
- SQL Server ->> Move characters in string N position(s) forward/backward based on ASCII table(根据ASCII表的排列顺序将字符串内的数值往前或者后移N个位)
去年无聊的时候想到想玩一下根据ASCII表的排列顺序将字符串内的数值往前或者后移N个位,顺便看一下是T-SQL性能好还是用C#写CLR函数处理得快.结果是在50万行以下其实两者差距很小,当然这是在我的 ...
- java移动/赋值文件 copy/move file
public class FileAccess { public static boolean Move(File srcFile, String destPath) { // Destination ...
- C++ 11 右值引用以及std::move
转载请注明出处:http://blog.csdn.net/luotuo44/article/details/46779063 新类型: int和int&是什么?都是类型.int是整数类型,in ...
- move.js运动插件
move.js 运动插件是一款针对元素动画效果的插件.可以运用此插件制作出各类元素效果. 插件GitHub地址:https://github.com/visionmedia/move.js 下面整理学 ...
- Add GUI to connect to SQL
(*********************************************************************************) (* *) (* Below i ...
- 【Zookeeper】源码之序列化
一.前言 在完成了前面的理论学习后,现在可以从源码角度来解析Zookeeper的细节,首先笔者想从序列化入手,因为在网络通信.数据存储中都用到了序列化,下面开始分析. 二.序列化 序列化主要在zook ...
- 从零讲解搭建一个NIO消息服务端
本文首发于本博客,如需转载,请申明出处. 假设 假设你已经了解并实现过了一些OIO消息服务端,并对异步消息服务端更有兴趣,那么本文或许能带你更好的入门,并了解JDK部分源码的关系流程,正如题目所说,笔 ...
- 理解Java的NIO
同步与阻塞 同步和异步是针对应用程序和内核的交互而言的. 同步:执行一个操作之后,进程触发IO操作并等待(阻塞)或者轮询的去查看IO的操作(非阻塞)是否完成,等待结果,然后才继续执行后续的操作. 异步 ...
- Java NIO之Selector(选择器)
历史回顾: Java NIO 概览 Java NIO 之 Buffer(缓冲区) Java NIO 之 Channel(通道) 其他高赞文章: 面试中关于Redis的问题看这篇就够了 一文轻松搞懂re ...
随机推荐
- Ext.Net 使用总结之查询条件中的起始日期
2.关于查询条件中起始日期的布局方式 首先上一张图,来展示一下我的查询条件的布局,如下: 大多数时候,我们的查询条件都是一个条件占一个格子,但也有不同的时候,如:查询条件是起始日期,则需要将这两个条件 ...
- visio 2013 破解工具 - KMSpico
背景:环境是 win7, 64 bit装了 visio 2013 , 可以却不能用它来画图,在网上找了一些破解工具,大都不能解决问题.网上不靠谱的广告型文章太多了,比较头痛. 所幸,终于找到正确的破解 ...
- .net string format
转自:http://www.cnblogs.com/jobs2/p/3948049.html 转自:http://jingyan.baidu.com/article/48206aeaf8c52f216 ...
- VB.NET中vbcr 是回车、vbcrlf 是回车和换行的结合、vblf 是换行
cr 是回车,是到本行的头部 lf 是换行,是到下一行 crlf 是到下一行的头部 vbcrlf=vbcr & vblf Windows 一般使用vbcrlf换行 Unix ...
- Oracle聚合求和和聚合求积(顺便解决BOM展开的问题)
本文参考网址:http://www.itpub.net/thread-1020772-1-1.html 我们在日常的工作中,经常遇到了针对某一列的值,进行求和,求平均值,在一些特殊的业务场景下,我们需 ...
- jQuery中 prop() attr()使用详解
对于HTML元素本身就带有的固有属性,在处理时,使用prop方法. 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法. 在高版本的jquery引入prop方法后,什么时候该用p ...
- javascript中this指针的认识
javascript中上下文环境就是this指针,即被调用函数所处的环境.这个上下文环境在大多数情况下指的是函数运行时封装这个函数的那个对象:当不通过任何对象单独调用一个函数时,上下文环境指的就是全局 ...
- <正向/反向>最大匹配算法(Java)
算法描述(正向): 给定最大词长n,待分词文本str,指针f=0,词典dic文档 1 取子串sub=str(f,f+n) 2 如果(遍历dic,有匹配sub) f++; 3 否则 n--; 4 注意: ...
- glib源码安装使用方法
glib库是GTK+和GNOME工程的基础底层核心程序库,是一个综合用途的实用的轻量级的C程序库,它提供C语言的常用的数据结构的定义.相关的处理函数,有趣而实用的宏,可移植的封装和一些运行时机能,如事 ...
- printf与scanf的返回值、注意点
printf()的返回值为其输出字符串常量的字符数(注意字符数与字数的区别)注意计数针对所有的打印字符,包括空格和不可见的换行字符(不包括字符串的空字符). scanf()函数返回成功读入的项目的个数 ...