AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Binäre Ausgabe in Konsolenfenster

Ein Thema von Chewie · begonnen am 22. Feb 2003 · letzter Beitrag vom 22. Feb 2003
Antwort Antwort
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#1

Binäre Ausgabe in Konsolenfenster

  Alt 22. Feb 2003, 12:45
Ich bin gerade dabei, mir ein CGI-Programm für den Apache zu bauen, das SVG-Daten automatisch komprimiert, sprich in SVGZ-Daten umwandelt. Mein Programm öffnet dazu die Datei, die der Apache übertragen will, komprimiert den Inhalt und speichert die komprimierte Datei in einem MemoryStream. Eingabe und Verarbeitung funktioniert, damit die gute Eva aber glücklich ist, fehlt natürlich noch die Ausgabe. Und an der haperts.
Da die komprimierten Daten binär sind, kann ich zum Lesen aus dem Memory-Stream keine Strings benutzen. Also habe ich es mit einem Array of Byte versucht, das den Inhalt des Streams einliest und dann in die Standard-Ausgabe schreibt. Codemäßig sieht das so aus:

Delphi-Quellcode:
var
  InputStream: TFileStream;
  OutputStream: TMemoryStream;
  CompressionStream: ZLib.TCompressionStream;
  buf: Array of Byte;
  a: Integer;
  SVGPath: String;

begin
  WriteLn('Content-type: image/xml-svg');
  WriteLn;
  SVGPath := GetEnvVar('PATH_TRANSLATED'); //Dateiname als Apache-Umgebungsvariable
  InputStream:=TFileStream.Create(SVGPath, fmOpenRead);
  OutputStream:=TMemoryStream.Create;
  CompressionStream:=TCompressionStream.Create(clMax, OutputStream);
  CompressionStream.CopyFrom(InputStream, InputStream.Size);
  CompressionStream.Free;
  SetLength(buf,OutputStream.Size);
  OutputStream.Read(buf,OutputStream.Size);
  OutputStream.SaveToFile('c:/test.svgz'); //Datei, um erfolgreiche Komrprimierung zu bestätigen: erfolgreich
  for a := 0 to Length(buf) - 1 do write(char(buf[a])); //hier Ausgabe
  OutputStream.Free;
  InputStream.Free;
end.
Ausgegeben bekomme ich hier lauter #00. Kann mir einer sagen, warum??
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 22. Feb 2003, 14:30
Moin Chewie,

wenn ich das richtig sehe, dann hat OutputStream die Grösse 0, denn er wird nur angelegt, aber nichts da reingeschrieben, somit wird die Länge von buf auf 0 gesetzt, und die Schleife läuft von 0 bis -1, wird also übersprungen.

Zitat von Chewie:
Da die komprimierten Daten binär sind, kann ich zum Lesen aus dem Memory-Stream keine Strings benutzen.
doch:

Delphi-Quellcode:
var
  sBuf : string;
  msIN : TMemoryStream;

begin
  msIN := TMemoryStream.Create;
  try
    msIN.LoadFromFile('IrgendeineDatei');
    SetLength(sBuf,msIN.Size);
    msIN.Read(sBuf[1],length(sBuf));
  finally
    FreeAndNil(msIN);
  end;
end;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#3
  Alt 22. Feb 2003, 14:35
Zitat von Christian Seehase:
Moin Chewie,

wenn ich das richtig sehe, dann hat OutputStream die Grösse 0, denn er wird nur angelegt, aber nichts da reingeschrieben, somit wird die Länge von buf auf 0 gesetzt, und die Schleife läuft von 0 bis -1, wird also übersprungen.
Nein, leider nicht. Bei TCompressionStream.Create wird OutputStream übergeben; in diesen wird laut den Kommentaren in der zlib.pas die komprimierten Daten kopiert. Und wenn ich OutputStream.SaveToFile ausführe, werden ja die Daten richtig gespeichert.
Nur das Lesen klappt nicht. buf ist voller Nullen. Auch wenn ich buf als String deklarier, macht es keinen Unterschied.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 22. Feb 2003, 14:39
Moin Chewie,

solange Du den Buffer nicht als String benutzt, also z.B. mit ShowMessage ausgeben willst, oder mit + sNochnString etwas anfügen willst spielen binäre Nullen im String aber keine Rolle, denn die Längenangabe wird von Nullen im String nicht berührt.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#5
  Alt 22. Feb 2003, 14:56
OK, warum es mit dem MemoryStream nicht funktiniert, versteh ich nicht, aber es klappt mit einem StringStream.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz