Entwickler-Ecke

Dateizugriff - Datei binär ausgeben


creeky - So 06.02.05 15:35
Titel: Datei binär ausgeben
Hallo,

ich möchte mir ein kleines Tool schreiben, mit dem ich jegliche Art von Dateien Binär auslesen kann.
Genauer gesagt will ich (rein Interesse halber) die einzelnen Speicherblöcke der Datei als Binör-Code ausgeben lassen.
Wie lässr sich dies realisieren.

Ich wäre über schnelle Antwort erfreut.

creeky


Udontknow - So 06.02.05 15:39

Hallo!

Einzelne Speicherblöcke? eine Datei ist erstmal nichts weiter als eine abgegrenzte Abfolge von Bytes, die nicht weiter segmentiert ist. Zumindest nicht auf logischer Seite. Wie das BS die Datei auf der HD ablegt, das ist eine andere Geschichte.
Benutze einfach einen FileStream, der eben die Daten byteweise ausliest. Siehe Delphi-Hilfe zu TFileStream.

Cu,
Udontknow


creeky - So 06.02.05 16:06

Okay, ich habe mich falsch ausgedrückt.

Da ich noch Neuling in Sachen Delphi bin, könntet ihr mir bitte genauere Anweisungen oder Links geben.


Udontknow - So 06.02.05 16:47

Hier mal der Code, um die einzelnen Byte-Werte in ein Memo zu schreiben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure TForm1.DumpFileToMemo(FileName:String);
var Stream:TFileStream;
var Str:String;
var B:Byte;
begin
  //Stream erstellen
  Stream:=TFileStream.Create(FileName,fmOpenRead);
  try
    Str:='';
    //Solange durchgehen, bis alle Bytes eingelesen wurden
    While Stream.Position<Stream.Size do
    begin
      //Byte einlesen
      Stream.ReadBuffer(B,SizeOf(B));
      //Zu String hinzufügen
      Str:=Str+IntToStr(B)+'-';

      //Nach jeweils 10 Bytes Ausgabe
      if Stream.Position mod 10 = 9 then
      begin
        Memo1.Lines.Add(Str);
        Str:='';
      end
    end;
  finally
    //Stream wieder freigeben
    Stream.Free;
  end;
end;


Cu,
Udontknow


creeky - So 06.02.05 17:15

Danke.

Zitat:
if Stream.Position mod 10 = 9 then


Da hast dich glaub verschrieben. Muss doch so heißen:

Delphi-Quelltext
1:
if Stream.Position mod 10 = 0 then                    


Ich versteh das schon richtig, dass ich jetzt das Ganze noch in Binär-Code umwandeln muss.

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.


creeky - So 06.02.05 18:31

Vielen Dank für den Quellcode.

Ich habe nur noch ein Problem. Wenn ich größere Dateien öffnen möchte (z.B. mp3-Dateien) dann stürzt das Programm ab. An was liegt das? wie kann ich das ändern?


retnyg - So 06.02.05 18:50

creeky hat folgendes geschrieben:
Ich habe nur noch ein Problem. Wenn ich größere Dateien öffnen möchte (z.B. mp3-Dateien) dann stürzt das Programm ab. An was liegt das? wie kann ich das ändern?

vielleicht daran dass gewisse binärzeichen für systemdinge reserviert sind und beim versuch diese darzustellen ein fehler auftritt. rein theoretisch sollte der fehler bei fast jeder nicht-textdatei auftreten


creeky - So 06.02.05 19:24

Und dies lässt sich nicht irgendwie umgehen?


Delete - So 06.02.05 19:27

retnyg hat folgendes geschrieben:
creeky hat folgendes geschrieben:
Ich habe nur noch ein Problem. Wenn ich größere Dateien öffnen möchte (z.B. mp3-Dateien) dann stürzt das Programm ab. An was liegt das? wie kann ich das ändern?

vielleicht daran dass gewisse binärzeichen für systemdinge reserviert sind und beim versuch diese darzustellen ein fehler auftritt. rein theoretisch sollte der fehler bei fast jeder nicht-textdatei auftreten

das glaube ichnicht Tim. Ich kann mit meinem HexLoader: http://www.luckie-online.de/Delphi/Sonstiges/HexLoader.html jeder Dastei binär in einem Memo darstellen. Hex-Editoren können das ja auch.


retnyg - So 06.02.05 19:58

aber gewisse zeichen wie #13 #10 #9 usw werden auch als solche interpretiert -> linefeed z.b.
um dies zu umgehen muss man diese zeichen "ausfiltern"


Udontknow - Mo 07.02.05 09:19

Nun, es werden ja nicht die Zeichen ins Memo geschrieben, sondern die dezimalen Werte.


Delphi-Quelltext
1:
IntToStr(B)<>Char(B)                    


Wobei mein Code wirklich noch etwas fehlerhaft ist, da er unter Umständen die letzten Zeichen einer Datei nicht zeigt. Abstürzen sollte es aber nicht, obwohl es äusserst unperformant ist. Es sollte ja auch nur demonstrieren, wie es geht.

Edit: Was für ein BS hast du? Unter Win95 war die Menge, die ein Memo aufnehmen konnte, begrenzt, meine ich mich zu erinnern...

Cu,
Udontknow


Delete - Mo 07.02.05 12:36

Da der Threadstarter wohl nicht selber dazu in der Lage ist, mache ich es mal. Das ganze wird asuch parralle in der DP diskutiert und dort habe ich meinen Code für meinen Hex-Loader gepostet: http://www.luckie-online.de/Delphi/Sonstiges/HexLoader.html