완전히 이해하지는 못했지만이 바이너리 형식에 대한 파서가 있고 코드를 제어하는 것처럼 들립니다. 따라서이 답변은 그 가정에 기반을두고 있습니다.
파서는 어떤 식 으로든 구조체, 클래스 또는 언어가 가진 모든 데이터 구조를 채울 것입니다. ToString
파싱되는 모든 것에 대해 를 구현하면 , 이진 데이터를 사람이 읽을 수있는 형식으로 표시하는 매우 사용하기 쉽고 유지 관리가 쉬운 방법으로 끝납니다.
당신은 본질적으로 :
byte[] arrayOfBytes; // initialized somehow
Object obj = Parser.parse(arrayOfBytes);
Logger.log(obj.ToString());
그리고 그것을 사용하는 관점에서, 그것입니다. 물론 이것은 클래스 / 구조체 / 무엇이든에 ToString
대한 기능을 구현 / 재정의 Object
해야하며 중첩 된 클래스 / 구조체 / 기타에 대해서도 그렇게해야합니다.
또한 조건문을 사용하여 ToString
릴리스 코드에서 함수가 호출되는 것을 방지하여 디버그 모드 외부에서 로그되지 않는 항목에 시간을 낭비하지 않도록 할 수 있습니다.
귀하의 ToString
이 같은 힘의 모양을
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);
원래의 질문은이 작업을 다소 시도한 것처럼 들리며이 방법이 부담 스럽다고 생각하지만 어느 시점에서 이진 형식 구문 분석을 구현하고 해당 데이터를 저장하는 변수를 만들었습니다. 따라서 기존 변수를 적절한 추상화 수준 (변수가있는 클래스 / 구조)으로 인쇄하기 만하면됩니다.
이 작업은 한 번만 수행하면되며 파서를 작성하는 동안 수행 할 수 있습니다. 그리고 바이너리 형식이 변경 될 때만 변경됩니다 (이미 파서에 대한 변경을 프롬프트합니다).
비슷한 맥락에서 : 일부 언어에는 클래스를 XML 또는 JSON으로 변환하는 강력한 기능이 있습니다. C #이 특히 좋습니다. 이진 형식을 포기할 필요는 없습니다. 디버그 로깅 문에서 XML 또는 JSON을 수행하고 릴리스 코드 만 남겨 두십시오.
16 진수 덤프 경로는 오류가 발생하기 쉽기 때문에 개인적으로 권장하지 않습니다 (오른쪽 바이트에서 시작 했습니까? 왼쪽에서 오른쪽을 읽을 때 올바른 엔디안 등을보고 있는지 확인하십시오) .
예 : ToStrings
뱉어 낸 변수를 말하십시오 a,b,c,d,e,f,g,h
. 프로그램을 실행하고의 버그를 발견 g
했지만 문제가 실제로 시작되었습니다 c
(그러나 디버깅 중이므로 아직 파악하지 못했습니다). 입력 값을 알고 있으면 c
문제가 시작되는 위치를 즉시 알 수 있습니다 .
단지 당신에게 알려주는 16 진 덤프와 비교된다 338E 8455 0000 FF76 0000 E444 ....
; 필드의 크기가 다양 c
하고 시작 위치와 값은 무엇입니까-16 진수 편집기가 알려 주지만 내 요점은 오류가 발생하기 쉽고 시간이 많이 걸리는 것입니다. 뿐만 아니라 16 진 뷰어를 통해 테스트를 쉽고 빠르게 자동화 할 수는 없습니다. 데이터를 파싱 한 후 문자열을 인쇄하면 프로그램이 '생각하는 것'을 정확하게 알 수 있으며 자동화 된 테스트 경로를 따라 한 단계가됩니다.