Ich bin mir nicht sicher, ob ich das vollständig verstehe, aber es hört sich so an, als hätten Sie einen Parser für dieses Binärformat und steuern den Code dafür. Diese Antwort basiert also auf dieser Annahme.
Ein Parser füllt in irgendeiner Weise Strukturen, Klassen oder die Datenstruktur Ihrer Sprache aus. Wenn Sie a ToString
für alles implementieren, was analysiert wird, erhalten Sie eine sehr einfach zu verwendende und leicht zu wartende Methode, um diese Binärdaten in einem für Menschen lesbaren Format anzuzeigen.
Sie hätten im Wesentlichen:
byte[] arrayOfBytes; // initialized somehow
Object obj = Parser.parse(arrayOfBytes);
Logger.log(obj.ToString());
Und das war's, vom Standpunkt der Verwendung. Dies erfordert natürlich, dass Sie die ToString
Funktion für Ihre Object
Klasse / Struktur / was auch immer implementieren / überschreiben , und Sie müssten dies auch für alle verschachtelten Klassen / Strukturen / was auch immer tun.
Sie können zusätzlich eine bedingte Anweisung verwenden, um zu verhindern, dass die ToString
Funktion im Release-Code aufgerufen wird, damit Sie keine Zeit mit etwas verschwenden, das außerhalb des Debug-Modus nicht protokolliert wird.
Sie ToString
könnten so aussehen:
return String.Format("%d,%d,%d,%d", int32var, int16var, int8var, int32var2);
// OR
return String.Format("%s:%d,%s:%d,%s:%d,%s:%d", varName1, int32var, varName2, int16var, varName3, int8var, varName4, int32var2);
Bei Ihrer ursprünglichen Frage klingt es so, als hätten Sie etwas versucht, dies zu tun, und Sie halten diese Methode für lästig, aber Sie haben auch irgendwann das Parsen eines Binärformats implementiert und Variablen zum Speichern dieser Daten erstellt. Sie müssen also nur die vorhandenen Variablen auf der entsprechenden Abstraktionsebene drucken (die Klasse / Struktur, in der sich die Variable befindet).
Dies sollten Sie nur einmal tun müssen, und Sie können dies tun, während Sie den Parser erstellen. Und es ändert sich nur, wenn sich das Binärformat ändert (was ohnehin schon zu einer Änderung Ihres Parsers führt).
In ähnlicher Weise: Einige Sprachen verfügen über robuste Funktionen zum Umwandeln von Klassen in XML oder JSON. C # ist besonders gut darin. Sie müssen Ihr Binärformat nicht aufgeben, sondern führen nur XML oder JSON in einer Debug-Protokollierungsanweisung aus und lassen Ihren Release-Code in Ruhe.
Ich persönlich würde empfehlen, den Hex-Dump-Weg nicht zu wählen, da er fehleranfällig ist (haben Sie mit dem rechten Byte begonnen, sind Sie sicher, dass Sie beim Lesen von links nach rechts die richtige Endianness "sehen" usw.) .
Beispiel: Sagen Sie Ihre ToStrings
Spuckvariablen a,b,c,d,e,f,g,h
. Sie führen Ihr Programm aus und bemerken einen Fehler mit g
, aber das Problem begann wirklich mit c
(aber Sie debuggen, also haben Sie das noch nicht herausgefunden). Wenn Sie die Eingabewerte kennen (und sollten), werden Sie sofort sehen, dass c
hier Probleme beginnen.
Im Vergleich zu einem Hex-Dump, der Ihnen nur sagt 338E 8455 0000 FF76 0000 E444 ....
; Wenn Ihre Felder unterschiedlich groß sind, wo c
beginnt und was der Wert ist - ein Hex-Editor wird es Ihnen sagen, aber mein Punkt ist, dass dies fehleranfällig und zeitaufwändig ist. Darüber hinaus können Sie einen Test nicht einfach / schnell über einen Hex-Viewer automatisieren. Wenn Sie nach dem Parsen der Daten eine Zeichenfolge ausdrucken, erfahren Sie genau, was Ihr Programm "denkt", und dies ist ein Schritt auf dem Weg zum automatisierten Testen.