Unicode-Zeichenfolge und TStringStream

Delphi 2009 und höher verwendet unicode-Zeichenfolgen für Ihre Standard-string-Typ. Nach meinem Verständnis unicode-char ist eigentlich 16-bit-Wert oder 2-Byte (Hinweis: ich verstehe, gibt es die Möglichkeit, 3 oder 4 Byte, char, sondern wir betrachten das meistens der Fall ist). Allerdings fand ich, dass TStringStream ist nicht sehr zuverlässig zu manipulieren, diese Saiten. Zum Beispiel, TStringStream.Size-Eigenschaft gibt die Länge der Zeichenfolge, während ich denke, es sollte die Rückkehr der byte-Anzahl der enthaltenen string. Okay, Sie können es auf Ihre eigenen, aber die Sache, die wirklich verwirrt mich am meisten: TStringStream nicht Lesen oder schreiben in einen Puffer zuverlässig.

Bitte überprüfen Sie den folgenden code (es ist eine DUnit-test und schlägt immer fehl). Bitte lassen Sie mich wissen, wo das problem ist (ich war mit D2010, wenn das testen des Codes).

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;

Hinweis: ich habe bereits versucht, verwenden Sie eine Instanz von TMemoryStream als Vermittler von Lesen/schreiben des Puffers und verwenden CopyFrom der TStringStream zu Lesen, den Inhalt, die TMemoryStream mit gleichen fehlerhaften Effekt.

InformationsquelleAutor Luthfi | 2010-10-11
Schreibe einen Kommentar