完全に理解しているとは思いませんが、このバイナリ形式用のパーサーがあり、コードを制御しているようです。したがって、この答えはその前提に基づいています。
パーサーは何らかの方法で、構造体、クラス、または言語のデータ構造を埋めます。ToString
解析されるすべてに対してfor を実装すると、そのバイナリデータを人間が読める形式で表示する、非常に使いやすく保守が簡単な方法になります。
基本的に次のものがあります。
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進ビューアでテストを簡単/迅速に自動化することはできません。データを解析した後に文字列を印刷すると、プログラムが何を「考えている」かが正確にわかり、自動テストのパスに沿った一歩になります。