Ein einfacher FileHandler welcher die Bearbeitung beliebiger binärer Daten erlaubt.
Er kann verwendet werden, um die Inhalte einer beliebigen Datei auf der Basis einzelner Bytes zu modifizieren. Der Dateiinhalt wird komplett in den Speicher geladen und dann in einer hexadezimalen und einer ASCII Tabelle präsentiert, eine bei HEX Editoren gebräuchlichen Darstellung.
ASCII Kontrollzeichen (diejenigen Bytes mit einem Wert unter 0x20) werden in der HEX Tabelle mit einer helleren Farbe dargestellt als andere Bytes. Sie zeigen auch einen Tooltip Text mit der Bedeutung dieses Bytes, wenn der Mauszeiger darüber schweben gelassen wird.
Die Modifikation einzelner Bytes ist sowohl in der Tabelle mit einer Zelle pro Byte als auch in der ASCII Zeile rechts davon möglich.
Nach der Modifikation einer Tabellenzelle (sowohl HEX wie auch ASCII) muss entweder TAB oder ENTER gedrückt werden, um die Änderung zu bestätigen.
Eine Änderung in der ASCII Zelle wird nur diejenigen Bytes verändern, welche danach eine andere ASCII Repräsentation aufweisen. Damit wird das versehentliche Ändern von nicht-ASCII Bytes dieser Zeile verhindert.
Ausser durch direktes Bearbeiten individueller Byte-Zellen kann der Inhalt auch in verschiener Weise durch die verfügbaren Kommandos verändert werden. Viele von diesen arbeiten mit einem markierten Auswahlbereich von Bytes und arbeiten auf diesen. Falls nichts markiert ist, so wird das Byte an der aktuellen Cursor-Position betroffen sein, oder, falls der Cursor gerade in der Offset oder ASCII Spalte teht, die gesamte Zeile.
Mehrere der Kommandos verlangen nach einer Eingabe und dieser Eingabetext wird kreativ interpretiert, um eine bessere Verwendbarkeit zur Verfügung zu stellen, ohne die Toolbar mit zu vielen spezialisierten Kommandos zu überfüllen:
Generell können numerische Werte für einzelne Bytes entweder in dezimaler oder hexadezimaler Notation eingegeben werden, die Auswahl wird getroffen durch hinzufügen eines 0x-Prefix vor Hex-Zahlen (bei welchen das Parsen unabhängig von Gross-/Kleinschreibung ist). Sie müssen im Bereich von 0 bis 255 (inklusive) sein.
Leerzeichen werden generell ignoriert, ausser zwischen (einfachen oder doppelten) Anführungszeichen.
Wo ein Wert für ein individuelles Byte angegeben werden sollte, kann dies auch über Angabe eines beliebigen Zeichens zwischen einfachen Anführungszeichen geschehen, wie z.B. 'A' für den Wert 65 resp. 0x41
Wo eine ganze Sektion von Bytes eingegeben werden kann, so kann dies explizit über mehrere Hex-Bytes nach einem einzigen 0x-Präfix geschehen (z.B. 0xbaadf00d) oder durch Angabe eines in Anführungszeichen gesetzten String (wie z.B. "ASCII here", mit den doppelten Anführungszeichen!).
Bestehen Hex-Eingaben aus einer ungeraden Anzahl Hex-Zeichen, so wird eine führende (!) Null angenommen, somit wird 0x1234567 dann als 0x01234567 interpretiert.
Das Kommando zum Einfügen mehrerer Bytes auf einmal erlaubt die Angabe eines Multiplikators vor dem normalen expliziten Weg zur Angabe mehrerer Bytes. Dieser numerische Faktor sollte durch das * Zeichen von den Daten abgetrennt werden, die so wiederholt werden sollen.
Das Kommando zum Markieren (oder Auswählen) eines Bereichs von Bytes akzeptiert einen solchen Bereich durch zwei numerische Werte, welche durch das - Zeichen getrennt sind. Wenn dieses Trennzeichen angegeben wird, so darf einer der beiden Werte fehlen, womit das dafür passende naturliche Limit gewählt wird (fehlt also z.B. der erste der beiden Werte, wird Null angenommen resp. das Ende der Daten, falls der zweite fehlt).
Durch Eingabe eines leeren Strings hier wird die aktuelle Markierung entfernt (also alles wird deselektiert).
Durch alleinige Eingabe des speziellen Zeichens * wird alles von Beginn bis Ende markiert.
Falls nach diesen Versuchen der Eingabestring noch immer nicht zufriedenstellend interpretiert werden kann, so wird eine entsprechende Fehlermeldung für das festgestellte Problem angezeigt (meistens eine Parsing-Exception) und der Eingabewert wird erneut abgefragt, bevor das Kommando weiterfahren kann.
Falls ein Kommando ausgeführt wird, welches eine Eingabe zur Auführung benötigt, so wird ein Wert vorgeschlagen, welcher auf dem aktuellen Zustand beruht:
Ist eine Markierung vorhanden, so wird diese meist verwendet.
Andernfalls wird die aktuelle Cursor-Position oder die gesamte Zeile verwendet.
Die folgenden inhaltsbezogenen Kommandos sind verfügbar:
Finden: Findet Bytes beginnend bei der aktuellen Position und hebt nächsten Treffer hervor.
Tabelle 1.1. Eingabebeispiele für das Finden Kommando
'A'
| findet das nächste Vorkommen eines Bytes mit Wert 0x41 resp. 65. |
65
| Wie oben. |
0x41
| Wie oben. |
0xbaadf00d
| Findet und markiert die nächste Sequenz von 0xBA 0xAD 0xF0 0x0D. |
"ABcd"
| Findet und markiert die nächste Sequenz von 0x41 0x42 0x63 0x64. |
Auswählen: Fragt nach einem Bereich und wählt die entsprechenden Bytes aus.
Tabelle 1.2. Eingabebeispiele für das Auswählen Kommando
*
| Markiert alle Bytes vonm Beginn bis zum Ende. |
10-
| Markiert alles nach den ersten 10 Bytes. |
-34
| Markiert die ersten 34 Bytes. |
0x12 - 0xaf
| Markiert alles zwischen den zwei angegebenen Offsets. |
18 - 0xAF
| Markiert den gleichen Bereich wie das obere Beispiel. |
'A' - 'Z'
| Ein etwas exotischer Weg zum Markieren der Bytes zwischen den Offsets 0x61 und 0x7a. |
Kopieren: Kopiert eine Hex-String-Repräsentation der markierten Bytes in die Zwischenablage.
Der in die Zwischenablage kopierte String wird keinen 0x-Präfix aufweisen und auch keine Zeilenumbrüche oder sonstige Leerzeichen enthalten.
Setzen: Fragt nach einem Wert und setzt die ausgewählten Bytes auf ihn.
Tabelle 1.3. Eingabebeispiele für das Setzen Kommando
'A'
| Setzt alle markierten Bytes auf den Wert 0x41 resp. 65. |
65
| Wie oben. |
0x41
| Wie oben. |
Einfügen: Fügt ein einzelnes (Null-) Byte an der aktuellen Position ein.
Das neue Null-Byte wird an der aktuellen Cursor-Position eingefügt, wodurch das Byte an dieser Stelle (und aller nachfolgender Inhalt) um eins in Richtung Ende geschoben werden.
Multi-Einfügen: Fragt nach mehreren Bytes und fügt diese an der aktuellen Position ein.
Tabelle 1.4. Eingabebeispiele für das Multi-Einfügen Kommando
3*65
| Fügt drei Bytes mit dem Wert 0x41 resp. 65 ein. |
3 * 'A'
| Wie oben. |
0x3 * 0x41
| Wie oben. |
0xA * 0xbaadf00d
| Wiederholt die Byte-Sequenz 0xBA 0xAD 0xF0 0x0D 10 mal, wodurch gesamthaft 40 Bytes eingefügt werden. |
3 * "ein ASCII Text"
| Ähnliche wie oben, jedoch wird hier ein ASCII Text wiederholt. |
'A' * 'F'
| Ein etwas seltsamer Weg, um 65 mal den Wert für das Zeichen 'F' (0x46) einzufügen. |
Löschen: Löscht die Auswahl oder das Byte an der aktuellen Position.
Abhängig vom aktuellen Markierungsstatus wird das folgende geschehen:
Etwas markiert, Cursor irgendwo: Die aktuell markierten Bytes werden gelöscht und danach ist nichts mehr markiert.
Nichts markiert, Cursor an einer Byte-Zellenposition: Das Byte an der Position des Cursors wird gelöscht.
Nichts markiert, Cursor entweder einer Offset oder einer ASCII Zelle: Die gesamte Zeile an der Position des Cursors wird gelöscht.
Nichts markiert, Cursor ausserhalb der gültigen Bytes: Nichts wird gelöscht.
Da dieser FileHandler das Modifizieren und Speichern der geladenen Daten unterstützt, ist dies von seiner Natur her ein Editor.
Um sich als richtiger Editor zu verhalten, ist es jedoch notwendig, den gesamten Dateiinhalt in den Speicher zu laden, um beim Editieren keine Änderungen an der darunter liegenden Datei nötig zu machen. Für grosse Dateien kann dies daher zu Problemen mit dem Arbeitsspeicher führen.