我不确定我是否完全理解,但是听起来您有一个用于这种二进制格式的解析器,并且您可以控制它的代码。因此,此答案基于该假设。
解析器将以某种方式填充结构,类或语言所具有的任何数据结构。如果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,而无需考虑发布代码。
我个人建议不要使用十六进制转储路径,因为它容易出错(您是否从正确的字节开始,确定从左到右阅读时是否在“看到”正确的字节序,等等) 。
示例:说出您ToStrings
吐出的变量a,b,c,d,e,f,g,h
。您运行程序并注意到带有的错误g
,但问题实际上是从开始的c
(但是您正在调试,因此您尚未弄清楚)。如果知道输入值(并且应该知道),您将立即看到c
问题开始的地方。
与仅仅告诉你的十六进制转储相比338E 8455 0000 FF76 0000 E444 ....
; 如果您的字段大小不同,从哪里c
开始,值是什么-十六进制编辑器会告诉您,但我的意思是,这容易出错并且很耗时。不仅如此,而且您无法通过十六进制查看器轻松/快速地自动化测试。解析数据后打印出一个字符串将准确告诉您程序正在“思考”什么,这将是自动化测试过程中的第一步。