TStream in einen String konvertieren

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
chickendev
Beiträge: 37
Registriert: Do 23. Feb 2012, 03:41

TStream in einen String konvertieren

Beitrag von chickendev »

Hallo,

hat jemand zufällig ein Beispiel wie ich einen TStream in einen String konvertiere?

Ich habe eine Funktion, die aus einer Datei einen Stream erstellt und anschließend ausliest.

Code: Alles auswählen

Stream := TFileStream.Create('chunk', fmOpenRead);
Wie ließe sich das realisieren damit aus einem String ein TStream wird?

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TStream in einen String konvertieren

Beitrag von Socke »

chickendev hat geschrieben:Wie ließe sich das realisieren damit aus einem String ein TStream wird?
  • Du fragst google wie das geht.
  • Du suchst dir eine abwegigere Variante aus
  • Du erstellst einen String in der Größe des Streams und ließt die Daten aus dem Stream in den String
  • Du kopierst den Stream in einen TStringStream
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: TStream in einen String konvertieren

Beitrag von theo »

chickendev hat geschrieben: hat jemand zufällig ein Beispiel wie ich einen TStream in einen String konvertiere?
Zu welchem Zweck? Bist du sicher, dass du genau das willst?

Beschreibe das Ziel, nicht einen Schritt : http://www.tty1.net/smart-questions_de.html#goal" onclick="window.open(this.href);return false;

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: TStream in einen String konvertieren

Beitrag von carli »

Nutze setlength(), um den String auf Größe zu bringen und TStream.write() mit string[1] als Destination, um den Inhalt des Streams in die Datei zu schreiben.

chickendev
Beiträge: 37
Registriert: Do 23. Feb 2012, 03:41

Re: TStream in einen String konvertieren

Beitrag von chickendev »

Hi,

du hast recht, war falsch gefragt, also Folgendes :-)

Ich eine Funktion die einen i.d.R. 32 KB langen String generiert:

Code: Alles auswählen

procedure InitiateUpload(FileName : String);
var
  MyFile: file;
  Data: array [0..(CHUNKSIZE-1)] of Byte;
  Chunk : String;
  MD5Chunk, SHA1Chunk : String;
  LeftFileSize, ThisChunkSize: Integer;
begin
  LeftFileSize := getFileSize(FileName);
 
  AssignFile(MyFile, FileName);
  FileMode := fmOpenRead;
  Reset(MyFile, 1);
  try
    while not EOF(MyFile) do
    begin
      if LeftFileSize > CHUNKSIZE then
      begin
           //ShowMessage('Read '+IntToStr(SizeOf(Data))+' with Left: '+IntToStr(LeftFileSize));
           BlockRead(MyFile, Data, SizeOf(Data));
           Form1.ProgressBar1.Position:=Form1.ProgressBar1.Position+1;
           ThisChunkSize := CHUNKSIZE;
      end else
      begin
           //ShowMessage('Read '+IntToStr(LeftFileSize)+' with Left: '+IntToStr(LeftFileSize));
           BlockRead(MyFile, Data, LeftFileSize);
           Form1.ProgressBar1.Position:=Form1.ProgressBar1.Position+1;
           ThisChunkSize := LeftFileSize;
      end;
      Chunk := PChar(@Data[0]);
 
      MD5Chunk := UpperCase(MD5Print((MD5String(Chunk))));
      SHA1Chunk := UpperCase(SHA1(Chunk));
 
      //Ausgabe in der Konsole
      Form1.LogMemo.Text := Form1.LogMemo.Text + IntToStr(Form1.ProgressBar1.Position)+'/'+IntToStr(Form1.ProgressBar1.Max)+' - MD5:'+MD5Chunk+' SHA1:'+SHA1Chunk+' with '+IntToStr(ThisChunkSize)+' Bytes';
 
      //Verfügbarkeit Testen
      if testAvailability ( MD5Chunk, SHA1Chunk, IntToStr(ThisChunkSize)) then begin
         Form1.LogMemo.Text := Form1.LogMemo.Text + '- verfügbar'+#13#10;
      end else begin
         Form1.LogMemo.Text := Form1.LogMemo.Text + '- nicht verfügbar'+#13#10;
         ShowMessage(sendChunk(Chunk));
      end;
 
      //Jetzt ggf uploaden..
 
      LeftFileSize := LeftFileSize - CHUNKSIZE;
    end;
  finally
    CloseFile(MyFile);
  end;
end;
Anschließend wird mit Hilfe der Synapse Bibliothek eine Datei über HTTP an meinen Server gesendet:

Code: Alles auswählen

function sendChunk (Data : String) : String;
var
  Stream: TStream;
  List: TStringList;
  Response : String;
  DStream : TStream;
begin
  Stream := TFileStream.Create('chunk', fmOpenRead);
  List:=TStringList.Create;
 
  HttpPostFile('http://xyz.php?auth='+AUTHKEY, 'chunk', 'chunk', Stream, List);
 
  Response := List.Text;
  Stream.Free;
  List.Free;
  Result := Response;
end;
Mein Problem ist folgendes:
Ich bin derzeit noch nicht in der Lage aus einem String einen Stream zu erzeugen sodass "HttpPostFile" dies korrekt verarbeiten kann. Ich musste gerade noch feststellen das

Code: Alles auswählen

Chunk := PChar(@Data[0]);
anscheinend doch nicht mein Array in einen String konvertiert.

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: TStream in einen String konvertieren

Beitrag von theo »

chickendev hat geschrieben:Ich bin derzeit noch nicht in der Lage aus einem String einen Stream zu erzeugen
Ich spar mir den ganzen Code.

Die Antwort auf diese Frage:

Code: Alles auswählen

Strm.WriteBuffer(strng[1],length(strng));

chickendev
Beiträge: 37
Registriert: Do 23. Feb 2012, 03:41

Re: TStream in einen String konvertieren

Beitrag von chickendev »

theo hat geschrieben:
chickendev hat geschrieben:Ich bin derzeit noch nicht in der Lage aus einem String einen Stream zu erzeugen
Ich spar mir den ganzen Code.

Die Antwort auf diese Frage:

Code: Alles auswählen

Strm.WriteBuffer(strng[1],length(strng));
Danke, ich habe inzwischen festgestellt das ich einen dicken Denkfehler in der ganzen Sache habe, bei den eingelesenen Daten handelt es sich um binäre Daten und die length()-Funktion bei Binären Daten falsche Werte an.

Ich glaube ich komme nicht darum herum das Byte Array mit einer For-Schleife zur durchlaufen und in einen Stream zu schreiben, oder?

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TStream in einen String konvertieren

Beitrag von Socke »

chickendev hat geschrieben:Danke, ich habe inzwischen festgestellt das ich einen dicken Denkfehler in der ganzen Sache habe, bei den eingelesenen Daten handelt es sich um binäre Daten und die length()-Funktion bei Binären Daten falsche Werte an.
Die length()-Funktion liefert immer die Länge des Strings oder Arrays als Anzahl der Elemente. Bei Ansistrings (Standard mit Compilerschlater {$H+}) ist ein Element vom Typ Char genau so groß wie ein Element des Typs Array of Byte, nämlich genau 1 Byte. Da die Länge des Strings unabhängig von dessen Inhalt ist und auch so gespeichert wird, erhältst du hier immer korrekte Werte. Du musst natürlich vorher die Länge auf die gewünschte Größe setzen (mit SetLength()).

Bitte achte doch in Zukunft ein wenig auf das, was du schreibst. Dass du einen Denkfehler bei dir vermutest, wird klar. Darauf folgt die nebenordnende Konjunktion "und", auf die ein Hauptsatz folgen sollte. Der Wortkombination "die length()-Funktion bei Binären Daten falsche Werte an" fehlt mindestens ein Verb um ein vollständiger Satz gemäß den allgemein anerkannten Regeln der deutschen Sprache zu sein. Das ist immer recht schwer zu verstehen und nötigt deine Leser Annahmen zu treffen, die den Sachverhalt nicht oder nur eingeschränkt richtig wiedergeben. Dabei hoffe ich, dass ich in diesem Fall richtig geraten habe und sich deine darauffolgende Frage damit erübrigt haben sollte (die Antwort ist "Nein").
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

chickendev
Beiträge: 37
Registriert: Do 23. Feb 2012, 03:41

Re: TStream in einen String konvertieren

Beitrag von chickendev »

OK Vielen Dank :-)

Antworten