Nie jestem pewien, czy w pełni to rozumiem, ale wygląda na to, że masz parser dla tego formatu binarnego i kontrolujesz dla niego kod. Ta odpowiedź jest oparta na tym założeniu.
Analizator składni będzie w jakiś sposób wypełniał struktury, klasy lub dowolną strukturę danych, którą posiada Twój język. Jeśli zaimplementujesz a ToString
dla wszystkiego, co zostanie przeanalizowane, otrzymasz bardzo łatwą w użyciu i łatwą w utrzymaniu metodę wyświetlania tych danych binarnych w formacie czytelnym dla człowieka.
Zasadniczo miałbyś:
byte[] arrayOfBytes; // initialized somehow
Object obj = Parser.parse(arrayOfBytes);
Logger.log(obj.ToString());
I to wszystko, z punktu widzenia korzystania z niego. Oczywiście wymaga to zaimplementowania / przesłonięcia ToString
funkcji dla swojej Object
klasy / struct / cokolwiek, i musiałbyś to zrobić również dla wszystkich zagnieżdżonych klas / struktur / whatevers.
Możesz dodatkowo użyć instrukcji warunkowej, aby zapobiec ToString
wywołaniu funkcji w kodzie wersji, abyś nie marnował czasu na coś, co nie zostanie zarejestrowane poza trybem debugowania.
Twój ToString
może wyglądać tak:
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);
Twoje pierwotne pytanie brzmi, jakbyś próbował to zrobić, i że uważasz, że ta metoda jest uciążliwa, ale w pewnym momencie zaimplementowałeś także parsowanie formatu binarnego i stworzyłeś zmienne do przechowywania tych danych. Wszystko, co musisz zrobić, to wydrukować istniejące zmienne na odpowiednim poziomie abstrakcji (klasa / struktura, w której znajduje się zmienna).
Jest to coś, co powinieneś zrobić tylko raz, i możesz to zrobić podczas budowania parsera. Zmieni się on tylko wtedy, gdy zmieni się format binarny (co i tak już spowoduje zmianę parsera).
Podobnie: niektóre języki mają solidne funkcje przekształcania klas w XML lub JSON. C # jest w tym szczególnie dobry. Nie musisz rezygnować z formatu binarnego, po prostu wykonuj XML lub JSON w instrukcji rejestrowania debugowania i zostaw swój kod wersji w spokoju.
Osobiście polecam nie przechodzić trasy zrzutu szesnastkowego, ponieważ jest ona podatna na błędy (czy zacząłeś od prawego bajtu, czy jesteś pewien, że kiedy czytasz od lewej do prawej, że „widzisz” prawidłową endianizm itp.) .
Przykład: Powiedz swoje ToStrings
zmienne wypluwające a,b,c,d,e,f,g,h
. Uruchamiasz program i zauważasz błąd g
, ale problem naprawdę zaczął się od c
(ale debugujesz, więc jeszcze tego nie odkryłeś). Jeśli znasz wartości wejściowe (i powinieneś), od razu zobaczysz, że c
tutaj zaczynają się problemy.
W porównaniu do zrzutu heksadecymalnego, który po prostu mówi 338E 8455 0000 FF76 0000 E444 ....
; jeśli twoje pola mają różną wielkość, gdzie c
zaczyna się i jaka jest wartość - edytor szesnastkowy powie ci, ale chodzi mi o to, że jest to podatne na błędy i czasochłonne. Ponadto nie można łatwo / szybko zautomatyzować testu za pomocą przeglądarki szesnastkowej. Wydrukowanie ciągu po analizie danych powie dokładnie, co twój program „myśli” i będzie jednym krokiem na drodze zautomatyzowanego testowania.