移动字符串或字符数组
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;