zoukankan      html  css  js  c++  java
  • Move WriteBuffer ReadBuffer String

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

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

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

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

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

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

  • 相关阅读:
    Python列表List增删改查、拷贝
    面向对象之继承——python篇
    面向对象——python篇
    异常——python基础篇
    函数进阶
    文件操作——python基础篇
    函数(一)——python基础篇
    字典——python基础篇
    特有的字符串格式化函数format——python篇
    webdriver对应谷歌版本下载地址
  • 原文地址:https://www.cnblogs.com/findumars/p/5087578.html
Copyright © 2011-2022 走看看