Delphi 2009 и выше использует строки Unicode для их типа строки по умолчанию. Насколько я понимаю, unicode char на самом деле представляет собой 16-битное значение или 2 байта (примечание: я понимаю, что существует вероятность 3 или 4 байта char, но давайте рассмотрим наиболее обычный случай). Однако я обнаружил, что TStringStream не очень надежен для управления этими строками. Например, TStringStream Свойство .Size возвращает длину строки, хотя я думаю, что оно должно возвращать количество байтов содержащейся строки.Ладно, вы можете настроить это самостоятельно, но больше всего меня смутило следующее: TStringStream не выполняет чтение или запись в буфер надежно.
Пожалуйста, проверьте следующий код (это тест DUnit и всегда терпит неудачу). Пожалуйста, дайте мне знать, где проблема (я использовал D2010 при тестировании кода).
procedure TestTCPackage.TestStringStream;
const
cCount = 10;
cOrdMaxChar = Ord(High(Char));
var
B: Pointer;
SW, SR: TStringStream;
T: string;
i, j, k : Integer;
vStrings: array [0..cCount-1] of string;
begin
RandSeed := GetTickCount;
for i := 0 to cCount - 1 do
begin
j := Random(100) + 1;
SetLength(vStrings[i], j);
for k := 1 to j do
// fill string with random char (but no #0)
vStrings[i][k] := Char(Random(cOrdMaxChar-1) + 1);
end;
for i := 0 to cCount - 1 do
begin
SW := TStringStream.Create(vStrings[i]);
try
GetMem(B, SW.Size * SizeOf(Char));
try
SW.Read(B^, SW.Size * SizeOf(Char));
SR := TStringStream.Create;
try
SR.Write(B^, SW.Size * SizeOf(Char));
SR.Position := 0;
// check the string in the TStringStream with original value
Check(SR.DataString = vStrings[i]);
finally
SR.Free;
end;
finally
FreeMem(B);
end;
finally
SW.Free;
end;
end;
end;
Примечание: я уже пытался использовать экземпляр TMemoryStream в качестве посредника для чтения / записи буфера и использовать CopyFrom из TStringStream для чтения содержимое этого TMemoryStream с таким же эффектом сбоя.