-1

次のように、IdHttp を使用して Web からファイルをダウンロードしています。

var
 MS: TMemoryStream;

procedure Test1;
var
 Http: TIdHTTP;
begin
Http := TIdHTTP.Create(nil);
  try
    MS := TMemoryStream.Create;
    try
      Http.Get('http://www.test.com/test.exe', MS);
    finally
      MS.Free;
    end;
  finally
    Http.Free;
  end;
end;

その結果、ダウンロードされたファイル/ストリーム (発音がわからない) はMS.Memory.

を文字列に取得または変換したいのですが、MS.Memoryその逆も同様です。

Rob Kennedy がこの質問に投稿した関数を試しました: Converting TMemoryStream to 'String' in Delphi 2009

しかし、文字列 " MZP"を取得しました。

誰でも私を助けることができますか?

4

7 に答える 7

4

結果の文字列の長さを確認します。文字列にはすべてのバイナリファイルが含まれていると思いますが、文字列本体にゼロがあるため、ASCII 文字列として表示できません。実行可能ファイルの署名 (最初のバイト): 4D 5A 90 00。

于 2012-05-05T14:37:46.300 に答える
1

他の人が提案したように、エンコードせずにバイナリdllを文字列に変換することは意味がありません。ただし、これが本当に必要な場合は、TMemoryStreamの代わりにTStringStreamクラスを使用できます。TStringStream.DataStringプロパティは文字列を取得します。もう一度注意してください。バイナリデータを文字列に直接変換すると、不特定の再利用につながる可能性があります。エンコーディングスキーマを使用します:例:base64、16進文字列

于 2012-11-04T09:37:30.423 に答える
1

すべてのexe、dllファイルは署名MZP#0を含みます... pchar文字列(デルファイの巨大な文字列)の場合、#0は文字列の終わりを意味し、デバッグインスペクターはMZPを表示します。

ストリームの元の長さを保持すると、すべてのデータにアクセスできます。

于 2012-05-06T06:36:33.053 に答える
0

記録として、最近の Delphi では、以下のコードのように、TStreamReader/TStreamWriter を使用して、TStream の子孫との間で文字列を読み書きすることができます (ここで、LoadFromString/SaveToString は、文字列で何かを行うための独自のメソッドです)。ストリームから読み取り、ストリームに書き込むためにそれぞれオブジェクトから文字列を取得します):

procedure TStoryItem.LoadReadCom(const Stream: TStream);

begin
  var reader := TStreamReader.Create(Stream);
  LoadFromString(reader.ReadToEnd);
  FreeAndNil(reader); //the reader doesn't own the stream by default, so this won't close the stream
end;

procedure TStoryItem.SaveReadCom(const Stream: TStream);
begin
  var writer := TStreamWriter.Create(Stream);
  writer.Write(SaveToString);
  FreeAndNil(writer); //the writer doesn't own the stream by default, so this won't close the stream
end;
于 2021-12-08T23:24:45.487 に答える
0

TStringList クラスの LoadFromStream メソッドを使用できます。

于 2012-05-05T17:54:41.513 に答える