Delphi XE 的字符串理解

    技术2022-05-20  51

    移动字符串或字符数组

     

     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;

     



    最新回复(0)