Laden...

Hex View (Byte-Array in Hex Editor artigen String konvertieren)

Erstellt von AyrA vor 11 Jahren Letzter Beitrag vor 11 Jahren 7.680 Views
AyrA Themenstarter:in
60 Beiträge seit 2010
vor 11 Jahren
Hex View (Byte-Array in Hex Editor artigen String konvertieren)

Beschreibung:

Eine einzelne Funktion ohne jegliche externe Abhängigkeiten, die ein Byte Array in einen Hex Editor artigen String umwandelt.

private string HexView(byte[] data)
        {
            int i, j;
            string line = null;
            string retValue = string.Empty;
            for (i = 0; i < data.Length; i += 16)
            {
                line = string.Empty;
                for (j = 0; j < 16; j++)
                {
                    if (i + j < data.Length)
                    {
                        line += data[i + j].ToString("X2") + " ";
                    }
                    else
                    {
                        //Fill up empty Space
                        line += "   ";
                    }
                }
                line = line + "\t";
                for (j = 0; j < 16; j++)
                {
                    if (i + j < data.Length)
                    {
                        //Filter some Invalid chars
                        if (data[i + j] >= 32 &&
                            data[i + j] != 127 &&
                            data[i + j] != 128 &&
                            (data[i + j] <= 0x80 || data[i + j] >= 0xA0))
                        {
                            line += (char)data[i + j];
                        }
                        else
                        {
                            line += ".";
                        }
                    }
                    else
                    {
                        //Fill up empty Space
                        line += " ";
                    }
                }
                retValue += line + "\r\n";
            }
            return retValue;
        }

Enwtickle ein neues Archivierungsformat und Nutzer haben die Möglichkeit Daten daraus zu betrachten. Existiert kein externes Programm wird die Datei in einem internem Hex Viewer geöffnet. Die Funktion erweist sich auch als Praktisch, wenn Nutzer nach Binärdaten suchen können und man einen Ausschnitt anzeigen möchte.
Die Funktion erweitert die Letzte Zeile automatisch mit Leerzeichen, sollte das Byte Array nicht ein vielfaches von 16 sein.
Der \t splitter kann durch ein Leerzeichen ersetzt werden, um in die Konsole zu passen.

Verwendung:
Einfach die Funktion aufrufen und als Parameter das Byte Array übergeben.
Rückgabe ist ein Hex Editor artiger String. Dieser kann nach \t aufgesplittet werden um den HEX vom Text Teil zu trennen.
Der zurückgegebene String kann direkt als Text einer Textbox festgelegt, als Textdatei gespeichert oder in der Konsole ausgegeben werden. (z.B. für ein Hex Dump Tool)

**Einige einfache Modifizierungsmöglichkeiten:***Die Funktion kann statisch gemacht werden *um nicht 16 Bytes breit zu sein, einfach überall die 16 durch die gewünschte Zahl oder einen Parameter ersetzen. *Gleiches gilt für die Länge, anstatt data.Length überall einen Parameter angeben *Hex Zeichen können als Kleinbuchstaben ausgegeben werden, indem man das X in der .ToString("X2") Methode klein schreibt

Das Formular im Bild zeigt 1:1 wie der String ausgegeben wird.

Schlagwörter: HEX Editor Viewer

**:::

C
224 Beiträge seit 2009
vor 11 Jahren

Super Sache.
Eventuell string retValue und string line durch StringBuilder ersetzten.
Gruß, CoLo

AyrA Themenstarter:in
60 Beiträge seit 2010
vor 11 Jahren

Wäre keine schlechte Idee. Performance-Gewinn allerdings nur bei Vorausberechnung der String Länge.
Diese wäre glaube ich (einfach mal so aus dem Kopf raus):
WIDTH ist die Anzahl Bytes pro Zeile (standardmässig 16)


Math.Ceiling((double)data.Length/(double)WIDTH)*(WIDTH*4+3)

Erklärung:
Math.Ceiling((double)data.Length/(double)WIDTH) - Ermittelt die Anzahl Zeilen, wobei immer aufgerundet wird.
(WIDTH*4+3) - Die Länge einer Zeile, pro Byte sind das 4 Zeichen (2 Zeichen für die Hex Zahl 00-FF, 1 Zeichen für den Leerschlag danach, 1 Zeichen für die ASCII Ausgabe) plus 1 Tab Char \t plus 1 Zeilenumbruch \r\n

**:::

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo AyrA,

durch die Trennung der Berechnung von line und retValue schwächst du das Schlemiel the Painter's algorithm Problem zugegeben etwas ab, aber vorhanden ist es immer noch. Deshalb kann der resultierende quadratische Aufwand bei (sehr) großen Byte-Arrays durchaus zum Tragen kommen. Mit dem StringBuilder lässt es sich vermeiden, wenn auch eventuell mit etwas höheren - aber normalerweise nicht spürbaren - Kosten bei kurzen Eingaben. Näheres in [Artikel] Strings verketten: Performance-Betrachtung.

Weitere Diskussionen hierzu bei Bedarf bitte in dem passenden Unterforum in Entwicklung, jedenfalls nicht hier in Snippets.

herbivore

F
10.010 Beiträge seit 2004
vor 11 Jahren

ByteViewer Class
Der war bekannt?

AyrA Themenstarter:in
60 Beiträge seit 2010
vor 11 Jahren

Da der ByteViewer in System.Design enthalten ist, ist dieser von einem GUI oder zumindest von der Drawing Library Abhängig, welche in einer Konsolenanwending/DLL/Dienst zuerst manuell hinzugefügt werden muss.

Hinweis von herbivore vor 11 Jahren

Von den Verweisen mal ganz angesehen, erbt die ByteViewer-Klasse des .NET-Frameworks direkt von System.Windows.Forms.TableLayoutPanel und ist damit ein ausgewachsenes GUI-Control, ist also eindeutig nicht GUI-unabhängig. Aber wie dem auch sei: Die Alternativen sind jetzt bekannt und jeder kann für jede Situation selbst abwägen, was besser passt.

**:::