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

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

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

Beitragvon mintpc » 23. Okt 2018, 21:11 Wie lässt man sich den Bit/Byte-Inhalt einer Datei anzeigen?

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

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
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
mintpc
 
Beiträge: 123
Registriert: 6. Sep 2010, 17:39
Wohnort: Mailand
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0) | 
CPU-Target: Win 7
Nach oben

Beitragvon fliegermichl » 24. Okt 2018, 06:31 Re: Wie lässt man sich den Bit/Byte-Inhalt einer Datei anzei

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) 
fliegermichl
 
Beiträge: 289
Registriert: 9. Jun 2011, 08:42

Beitragvon h-elsner » 24. Okt 2018, 15:25 Re: Wie lässt man sich den Bit/Byte-Inhalt einer Datei anzei

@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
h-elsner
 
Beiträge: 57
Registriert: 24. Jul 2012, 14:42
Wohnort: Illertissen
OS, Lazarus, FPC: LINUX Mint18.3, Win10, Lazarus 1.8, FPC3.0.4 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 24. Okt 2018, 16:29 Re: Wie lässt man sich den Bit/Byte-Inhalt einer Datei anzei

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4343
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon mintpc » 24. Okt 2018, 20:37 Re: Wie lässt man sich den Bit/Byte-Inhalt einer Datei anzei

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.
mintpc
 
Beiträge: 123
Registriert: 6. Sep 2010, 17:39
Wohnort: Mailand
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0) | 
CPU-Target: Win 7
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste

porpoises-institution
accuracy-worried