Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Begrifferklärung und Dateiheaderfragen (https://www.delphipraxis.net/195647-begrifferklaerung-und-dateiheaderfragen.html)

fringer 15. Mär 2018 11:41

Begrifferklärung und Dateiheaderfragen
 
Hallo ich wußte nicht so recht wie ich das Thema nennen soll, deswegen entschuldigt den wirren Thread-Titel.

Ich habe in letzter Zeit in einigen Foren und Forenbeiträgen immer mal den Begriff "Magic Numbers" gelesen
und wollte einmal fragen was das genau ist. Dabei geht es nicht direkt um Delphi sondern allgemein um das Programmieren.
In einem Beitrag meinte mal jemand das es "verpönt" sei Magic Numbers in seinem Code zu verwenden.
Da ich das so noch nie gehört habe wollte ich mal Fragen was man darunter versteht.

Und dann habe ich noch einmal eine Frage zum Aufbau von Dateien. Eine Datei hat ja meistens einen Header.
Ich habe gelesen das in diesem Header sogenannte "Sections" stehen. Nun meine Frage dazu: Kann man ohne weiteres (ohne dem neu compilieren der Datei)
eine dieser Section entnehmen oder gar einfügen? Wenn ihr möchtet kann ich das ganze auch an einem Beispiel erklären,
warum mich das interessiert.

Vielleicht könnt ihr mir ja bei diesen Fragen Auskunft geben.
Vielen Dank schon mal.
fringer

himitsu 15. Mär 2018 11:46

AW: Begrifferklärung und Dateiheaderfragen
 
https://de.wikipedia.org/wiki/Magische_Zahl_(Informatik)
https://en.wikipedia.org/wiki/List_of_file_signatures

Im Prinzip ist das am Anfang von meist binären Dateien oft eine 2-4 Byte lange Kennung/Kennzahl.
Es ist eine kurze Kennung/Beschreibung für etwas Bestimmtes, wo man an der Stelle keinen "aussagefähigen" Bezeichner angeben will oder kann.

Oft nimmt man da irgendwelche CHARs "PE" Portable Execute (EXE und DLL) oder "PK" Packed? (ZIP).
Manchmal auch ascii-codierte nummerische Werte.



Diese "Nummern" werden nicht nur zur Kennung von Dateiypen, sondern auch von Datei-/Speicher-Blöcken verwendet.
z.B. die Sektionen innerhalb einer ZIP (Verzeichniseinträge, Blöcke der einzelnen Dateien usw.)
FastMM hat am Anfang seiner Blöcke eine Kennung, um zu schnell erkennen, dass es von ihm verwalteter Speicher ist.


Magic-Numbers im Code sind schon OK, aber du solltest sie als Konstante definieren und Verwenden.
Er meinte wohl, dass es verpönt ist diese Nummern direkt zu nutzen, also z.B. Komponente.Tag = 1 (Status A) und Komponente.Tag = 2 (Status B).


Und hier ein bissl Lesestoff zu den PE-Headern:
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
https://en.wikipedia.org/wiki/Portable_Executable
https://wiki.osdev.org/PE

http://www.delphibasics.info/home/de...ormat-overview
http://www.swissdelphicenter.com/de/...de.php?id=1302
https://www.delphi-treff.de/tipps-tr...pe-format-ist/

Zacherl 15. Mär 2018 11:49

AW: Begrifferklärung und Dateiheaderfragen
 
Beziehst du dich da auf PE-Files? Falls ja, dann ist das nachträgliche Hinzufügen einer Section meistens ohne Probleme möglich. Das Entfernen geht auch, unterliegt allerdings einigen Beschränkungen. Generell ist beides aber nicht trivial.

Zitat:

Zitat von fringer (Beitrag 1396207)
In einem Beitrag meinte mal jemand das es "verpönt" sei Magic Numbers in seinem Code zu verwenden.

Das bezieht sich denke ich auf eine andere Art von "magic numbers":

Als magic numbers bezeichnet man auch abfällig die Verwendung von numerischen Werten, für die eigentlich Konstanten definiert sind. Schaust du dir z.b. die MSDN-Library durchsuchenMessageBox Funktion an:
Delphi-Quellcode:
// Korrekter Aufruf
MessageBox(0, 'Text', 'Caption', MB_ICONWARNING);

// Magic numbers
MessageBox(0, 'Text', 'Caption', 48);
Funktioniert beides wunderbar, da
Delphi-Quellcode:
MB_ICONWARNING
als
Delphi-Quellcode:
0x00000030L
(hex), also
Delphi-Quellcode:
48
(dec) definiert ist; Problem ist allerdings die Lesbarkeit des Codes. Man sieht auf den ersten Blick nicht, woher diese ominöse "48" jetzt herkommt - anders bei der Konstante.

fringer 15. Mär 2018 12:17

AW: Begrifferklärung und Dateiheaderfragen
 
Vielen Dank für die schnellen Antworten.

Alles klar, ich denke ich habe beide Sachen im Zusammenhang mit Magic Numbers schon einmal gelesen.
Also werden einmal die ersten Bytes in gewissen Dateien zur Kennung als Magic Numbers bezeichnet, und einmal nicht aussagekräftige Konstanten.
Das könnte man also fast schon damit vergleichen wenn jemand in seinem Code für seine Variablen immer nur a, b, c und so weiter verwendet.
Ok, wieder etwas gelernt.

Bei der Frage zu dem Header geht es nicht direkt um PE Files. Ich will es aber mal erklären.

Ich habe eine Datei mit Header, meistens haben diese Dateien immer am Ende ihrer Dateigröße 20000kb für eine eingebette Ressource zur Verfügung.
Nun kann es manchmal sein das diese Ressource aber vergessen wurde.
Daher habe ich mal versucht manuell diese Ressource hinten an die Datei hinzugefügen. Das klappt auch. Die Datei ist nicht beschädigt.
Aber die Datei erkennt trotzdem die neu "angehangene" Ressource nicht, weil diese nicht im Header (als Section) deklariert ist.
Meine Theorie war daher mal zu probieren diese Section (aus einer anderen Datei bei der die Ressource dabei ist) in den Header einzufügen und damit auf diese Ressource zu verweisen damit sie erkannt wird und ohne die Datei unbrauchbar zu machen.
Ich hoffe ich habe das nicht zu unmständlich geschrieben. Ist auch alles erstmal nur Theorie und vielleicht geht es auch nicht.

KodeZwerg 15. Mär 2018 12:28

AW: Begrifferklärung und Dateiheaderfragen
 
Das liegt nicht am Header sondern intern am Code.
Eingebundene Resourcen werden mit ID's verwaltet die das Programm kennen muss und auch intern darauf zugreift.
Eine neue Resource einbinden ist kein Problem aber dem Programm beibringen sie zu nutzen, das geht nicht (soweit ich weiß).

Nachtrag falls ich es falsch verstanden habe:
Teste doch mal mit ResourceHacker o.ä. ob das Ziel deine neue Resource annimmt und beim Programm-Aufruf auch darauf zugreift.
Wenn das der Fall ist, ist dein Problem im nu erledigt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:06 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