您的位置:首页 > 编程语言 > Delphi

Delphi XE 的字符串理解

2011-02-25 21:53 183 查看
移动字符串或字符数组


 

 var

   Count: Integer;

   Buf1, Buf2: array[0..255] of Char;

 begin

   // 现有代码 - 不正确的,因为该字符串=UnicodeString

   Count := Length(Buf1);

   Move(Buf1, Buf2, Count);

  

   // 正确的Unicode

   Count := SizeOf(Buf1);                // <<-- 设置缓冲区的大小以字节为单位

   Count := Length(Buf1) * SizeOf(Char); // <<-- 设置缓冲区的大小以字节为单位

   Move(Buf1, Buf2, Count);

 end;

 

 

Length返回的字符的大小,但移动预计将在数个字节。在这种情况下,而不是长度在使用sizeof(或应当由字符的大小长度乘以)。

 

调用TStream.Read / ReadBuffer也应该考虑字符串或字符数组。考虑下面的代码:

 

 var

   S: string;

   L: Integer;

   Stream: TStream;

   Temp: AnsiString;

 begin

   // 现有代码 - 不正确的,因为该字符串=UnicodeString

   Stream.Read(L, SizeOf(Integer));

   SetLength(S, L);

   Stream.Read(Pointer(S)^, L);

  

   // 正确的数据为Unicode

   Stream.Read(L, SizeOf(Integer));

   SetLength(S, L);

   Stream.Read(Pointer(S)^, L * SizeOf(Char));  // <<-- 设置缓冲区的大小以字节为单位

  

   // 正确的ANSI数据

   Stream.Read(L, SizeOf(Integer));

   SetLength(Temp, L);              // <<-- 使用临时AnsiString类型

   Stream.Read(Pointer(Temp)^, L * SizeOf(AnsiChar));  // <<-- 设置缓冲区的大小以字节为单位

   S := Temp;                       // <<--转换为Unicode字符串

 end;

 

调用TStream.WriteBuffer. 考虑下面的代码:

 var

   S: string;

   Stream: TStream;

   Temp: AnsiString;

 begin

   // 现有代码 - 不正确的,因为该字符串=的UnicodeString

   Stream.Write(Pointer(S)^, Length(S));

  

   // 正确的数据为Unicode

   Stream.Write(Pointer(S)^, Length(S) * SizeOf(Char)); // <<-- 设置缓冲区的大小以字节为单位

  

   // 正确的ANSI数据

   Temp := S;          // <<--使用临时AnsiString类型

   Stream.Write(Pointer(Temp)^, Length(Temp) * SizeOf(AnsiChar));// <<-- 设置缓冲区的大小以字节为单位

end;

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  delphi integer stream string