AGB  ·  Datenschutz  ·  Impressum  







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

Einlesen von Binärdateien

Ein Thema von RuX · begonnen am 19. Sep 2006 · letzter Beitrag vom 19. Sep 2006
Antwort Antwort
Seite 2 von 2     12   
orest

Registriert seit: 19. Feb 2004
7 Beiträge
 
#11

Re: Einlesen von Binärdateien

  Alt 19. Sep 2006, 14:40
Zitat von mkinzler:
Dann versuch mal eine Binärdatei hier einzulesen.
Kein Problem.

Folgender Code ist zwar wahrscheinlich recht lahm, funktioniert aber zu 100%.
Ich habe gerade eben eine ca. 36MB große .exe damit kopiert.
Ein Dateivergleich ergab keine Unterschiede. Die MD5-Summen sind ebenfalls identisch.

Eine Datei in einen String einlesen:
Delphi-Quellcode:
function FileToString(const AFileName: string): AnsiString;
var
  f: TFileStream;
  l: Integer;
begin
  Result := '';
  f := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
  try
    l := f.Size;
    if L > 0 then
    begin
      SetLength(Result, l);
      F.ReadBuffer(Result[1], l);
    end;
  finally
    F.Free;
  end;
end;
Einen String in die eine Datei schreiben:
Delphi-Quellcode:
function StringToFile(const AData: AnsiString; AFileName: string): boolean;
var
  myFile: file of Char;
  i: integer;
begin
  try
    Result := false;
    AssignFile(myFile, AFileName);
    ReWrite(myFile);
    for i := 1 to Length(AData) do
      Write(myFile, AData[i]);
    Result := true;
  finally
    CloseFile(myFile);
  end;
end;
Wie Du siehst, es funktioniert eben doch!

Gruß,
Orest.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: Einlesen von Binärdateien

  Alt 19. Sep 2006, 14:50
Du hast diese datei ja nicht in den String gelesen, sondern in den Speicherbereich des Strings also in einen Buffer! das hatte ich übrigens schon in #4 vorgeschlagen.
Markus Kinzler
  Mit Zitat antworten Zitat
RuX

Registriert seit: 21. Jul 2004
Ort: Nürnberg
115 Beiträge
 
Delphi 7 Architect
 
#13

Re: Einlesen von Binärdateien

  Alt 19. Sep 2006, 14:56
Ok danke für eure Tipps.
So sieht jetzt meine Lösung aus:

Delphi-Quellcode:
var fs: tfilestream;
    buffer: array of byte;
    l: integer;
begin
  fs := TFileStream.Create(AFile, fmOpenRead);
  try
    l := fs.Size;
    SetLength(Buffer, l);
    fs.Seek(0, soFromBeginning); //sicherheitshalber
    l := fs.Read(buffer[0], l); //wichtig: erstes element des arrays da pointer
  finally
    fs.free;
  end;
end;
Delphi3/Delphi5/Delphi7/Delphi8 User
  Mit Zitat antworten Zitat
orest

Registriert seit: 19. Feb 2004
7 Beiträge
 
#14

Re: Einlesen von Binärdateien

  Alt 19. Sep 2006, 15:57
Zitat von mkinzler:
Du hast diese datei ja nicht in den String gelesen, sondern in den Speicherbereich des Strings also in einen Buffer! das hatte ich übrigens schon in #4 vorgeschlagen.
Natürlich sollte man die Daten in einen Buffer einlesen, und für so etwas keinen String verwenden, da gebe ich Dir uneingeschränkt recht!

Deine Aussage ist aber trotzdem die reinste Korinthenkakerei.

Da kannst Du genausogut sagen:

"Du kannst kein Datum auf einem Formular anzeigen lassen. Du musst ein Label verwenden und
den Datumswert in einen String umwandeln."

Im Endeffekt kommt es doch auf das selbe raus!

Wenn ich Dir jetzt ein FileToString schreibe welches mittels Read() immer einen einzelnen Character einliest und an den String dranhängt, dann schreist Du das der Character ein Buffer ist, und die Daten nicht direkt in den String eingelesen werden.
Nehme dann stattdessen BlockRead() schreist Du bestimmt wieder.

Ein AnsiString ist ein Pointer auf einen von Delphi automatisch verwalteten Speicherbereich, und kann somit als "Buffer" angesehen werden.

Aber darum geht es doch gar nicht!

Deine Aussage war:

"Du kannst eine Binärdatei nicht in einen String einlesen, weil er den Inhalt als Steuerzeichen interpretieren würde."

Damit drückst Du aus das ein String keine Binärdaten aufnehmen kann, und dies ist schlichtweg falsch. Da kannst Du Dich drehen und wenden wie Du willst. Das Du mit deiner Aussage genau dies gemein hast drückt deine Antwort auf mein Posting aus:

"Delphi verwendet aber nicht unbedingt den klassischen Pascal-String ( ShortString) sondern je nach Einstellung/Länge der Zeichenkette AnsiString (0-terminiert). Eine Binärdatei wird er aber kaum in einen ShortString (max 255 Zeicehn) bringen."

--> Ergo: Passt die Datei in einen ShortString dann gehts, ansonsten nicht weil AnsiString = 0-terminiert.

Daraufhin habe ich Dir gesagt das auch ein AnsiString nicht 0-terminiert ist. War er nie und wird er auch nie sein. Deiner Aufforderung eine Binärdatei in einen String einzulesen bin ich zu 100% nachgekommen und habe bewiesen das es möglich ist. Ob ich den String nun als Buffer oder sonstwie verwende, ist doch völlig unerheblich.

Wichtig in diesem Zusammenhang ist:
- Der String enthält hinterher exakt die Daten aus der Binärdatei.
- Innerhalb das Strings werden keine Steuerzeichen interpretiert.
- Ein AnsiString ist eben NICHT 0-terminiert.

Nochmals:
Es ging nicht darum wie die Daten in den String kommen, sondern DASS ein String sie aufnehmen
kann.

Ich wollte Dir eigentlich lediglich klarmachen das ein Ansi-String nicht 0-terminiert ist, und somit Deine Falschaussage richtigstellen.

Gruß.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 19:55 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