Autor Beitrag
creeky
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 06.02.05 15:35 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: So 06.02.05 16:47 
Hier mal der Code, um die einzelnen Byte-Werte in ein Memo zu schreiben:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 06.02.05 19:24 
Und dies lässt sich nicht irgendwie umgehen?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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: www.luckie-online.de...tiges/HexLoader.html jeder Dastei binär in einem Memo darstellen. Hex-Editoren können das ja auch.
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 07.02.05 09:19 
Nun, es werden ja nicht die Zeichen ins Memo geschrieben, sondern die dezimalen Werte.

ausblenden 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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: www.luckie-online.de...tiges/HexLoader.html