Wie lässt man sich den Bit/Byte-Inhalt einer Datei anzeigen?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Wie lässt man sich den Bit/Byte-Inhalt einer Datei anzeigen?

Beitrag von mintpc »

Hallo zusammen,

mit einem Hex-Editor kann ich mir den Hex-Code einer Bitmap-Datei anzeigen lassen. Das würde ich gerne mal (einfach so!!!)
mit Lazarus machen. D.h. ich möchte die Bit oder den Hex-Code einer Bitmap oder eine andere Datei z.B. im Memo-Feld anzeigen
lassen - quasi also wie ein Hex-Editor.

Ich bin nun so weit, dass ich die Bitmap über einen Stream einlese und im Memo-Feld ausgebe. Ich habe jetzt etliche Sachen probiert,
unter anderem das zum Beispiel:

Code: Alles auswählen

SL := TStringList.Create;
  mStream := TMemoryStream.Create;
 
  try
    mStream.LoadFromFile('Bild.bmp');
    SL.LoadFromStream(mStream);
    s := SL.Text;
  finally
    FreeAndNil(SL);
    FreeandNil(mStream);
  end;
 
  if Length(s) > 0 then
    Memo1.append(s);   

Funktioniert auch so weit, allerdings werden im Memo nur die ersten 3 Zeichen der Datei, nämlich das
"BM?" angezeigt.
BM.jpg
BM.jpg (1.39 KiB) 1405 mal betrachtet

Beim Test auf die Länge von s sollen es 170 Zeichen sein, und das bestätigt mir auch
ein normaler Hex-Editor. (Mein Test-Bitmap ist nur 4 Pixel groß).
Im Hex-Editor stehen in der Datei auch erst nur 0en, dann am Ende aber auch die entsprechenden
Byte der Farbcodierung.

Nun also die Frage, wie (und geht das überhaupt im Memo) komm ich an die entsprechende Darstellung,
d.h. wie lass ich mir die Bit anzeigen, oder auch als Hex-Zahlen.

Vielen Dank schonmal vorab
mintpc

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Wie lässt man sich den Bit/Byte-Inhalt einer Datei anzei

Beitrag von fliegermichl »

Na du gibst doch gar kein Hex im Memo aus sondern einen String und die sind Nullterminiert. Lies es z.B. als Array of Byte ein und gib jedes Byte nach Hex gewandelt aus.
In dem Beispiel habe ich eine Form mit einem Opendialog, einem Button und einem Memo. Im OnClick des Buttons schreibst Du:

Code: Alles auswählen

 
procedure TForm1.Button1Click(Sender: TObject);
var fs : TFilestream;
     ba : array of Byte;
    i, j : integer;
   s : string;
begin
 if OpenDialog1.Execute then
 begin
   fs := TFileStream.Create(opendialog1.Filename, fmOpenRead);
   SetLength(ba, fs.Size);
   fs.Read(ba[0], fs.Size);
   FreeAndNil(fs);
   s := '';
   Memo1.Clear;
   for i := Low(ba) to High(ba) do
   begin
     for j := 0 to 9 do
       if (High(ba) >= i+j) then s := s + IntToHex(ba[i+j], 2) + ' ';
     Memo1.Lines.Add(s);
     s := '';
   end;
 end;
end;
 


Edit: um es als Binärzeichen auszugeben, verwendest Du statt IntToHex

Code: Alles auswählen

 BinStr(ba[i+j], 8) 

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Wie lässt man sich den Bit/Byte-Inhalt einer Datei anzei

Beitrag von h-elsner »

@fliegermichl: Verständnisfrage - Warum lädst du den Filestream in ein array um? Macht es das irgendwie schneller? Würde auch ein TMemoryStream statt des Arrays gehen?

Wenn ich eine binäre Datei wie auch immer auswerten will, habe ich allerdings zwischen TFileStream und TMemoryStream keinen Geschwindigkeitsunterschied gesehen.
Es geht auch rechtschnell. Das Einzige, was bei mir Zeit verbraucht ist die Anzeige der Auswertung.

Gruß HE

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie lässt man sich den Bit/Byte-Inhalt einer Datei anzei

Beitrag von Mathias »

Auf diese Weise geht es auch noch recht schnell:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  f: file of byte;
  b: byte;
  i: integer;
  s: string;
begin
  if OpenDialog1.Execute then begin
    Memo1.Clear;
    AssignFile(f, OpenDialog1.FileName);
    Reset(f);
    s := '';
    for i := 0 to FileSize(f) - 1 do begin
      Read(f, b);
      s += IntToHex(b, 2) + ' ';
      if i mod 8 = 7 then begin
        Memo1.Lines.Add(s);
        s := '';
      end;
    end;
    Memo1.Lines.Add(s);
    CloseFile(f);
  end;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Re: Wie lässt man sich den Bit/Byte-Inhalt einer Datei anzei

Beitrag von mintpc »

Hallo zusammen,
super. Vielen Dank an die beiden langen Lösungen. Ich hab beide grade
durchgearbeitet und fange an, die Sache mehr und mehr zu verstehen.

...wenn ich die Ausgabe mit IntToStr mache, sehe ich die Zahlen von 0 bis 255.
Das bedeutet, dass ein Bitmap aus den Zahlwerten für Farben der einzelnen Pixel besteht,
RGB vermutlich. Aha!

Danke.

Antworten