4

「Hello World」文字列、clrf、およびランダムな 10 バイトを Delphi のメモリ ストリームに書き込む方法は?

4

2 に答える 2

9

このタスクにはバイナリライターの使用を検討します。これは、ストリームにデータを取得する詳細を処理する上位レベルのクラスです。

var
  Stream: TMemoryStream;
  Writer: TBinaryWriter;
  Bytes: TBytes;
....
Stream := TMemoryStream.Create;
try
  Writer := TBinaryWriter.Create(Stream);
  try
    Writer.Write(TEncoding.UTF8.GetBytes('Hello World'+sLineBreak));
    //if you prefer, use a different encoding for your text
    Bytes := GetRandomBytes(10);//I assume you can write this
    Writer.Write(Bytes);
  finally
    Writer.Free;
  end;
finally
  Stream.Free;
end;

あなたの本当の問題はこれよりももっと複雑だと思います。ライター クラスを使用する利点は、データをストリームに吐き出すという厄介な詳細から自分自身を隔離できることです。

于 2013-01-30T20:33:05.243 に答える
5
var
  ms: TMemoryStream;
  s: String;
  b: array[0..9] of Byte;
  i: Integer;
begin
  ms := TMemoryStream.Create;
  try
    s := 'Hello World' + #13#10;
    ms.Write(s[1], Length(s) * SizeOf(Char));
    for i := 0 to 9 do
      b[i] := Random(256);
    ms.Write(b[0], 10);
    // ms.SaveToFile('C:\temp\test.txt');

    {
    ms.Memory can be used for free access e.g.
    // build an empty buffer 5 characters
    s := '';
    SetLength(s,5);
    ms.Position := 5;
    // the position after which we want to copy
    i := Length('Hallo ')*SizeOf(Char);
    // copy bytes to string
    Move(TByteArray(ms.Memory^)[i],s[1],Length(s) * SizeOf(Char));
    Showmessage(s); // Display's "World"
    }


  finally
    ms.Free;
  end;    
end;
于 2013-01-30T20:27:04.663 に答える