Строка Unicode и TStringStream

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 с таким же эффектом сбоя.

7
задан Luthfi 11 October 2010 в 13:52
поделиться