Delphi XE 的字符串理解

移动字符串或字符数组

 

 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;

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值