转储很容易





3.00/5 (3投票s)
2004年8月27日
1分钟阅读

25647

2
一个用于轻松转储字节数组的小方法。
引言
在复杂的日志记录和异常捕获环境中,转储字节数组很有用。为此,任何程序员每次需要时都会编写自己的方法。
CodeProject 是一个用于存储每个程序员都需要使用的有用常用代码的平台,所以我添加了这个可以轻松转储类中内部数据的小方法。我打算发布这个可以轻松转储字节数组的方法。
public class Settings
{
public string fmt_2digits ="{0:d2}";
public string fmt_4digits ="{0:d4}";
public string fmt_2dhex ="{0:x2}";
}
private Settings _settings = new Settings();
private void TraceDump(byte []ms, string what)
{
byte [] arr = ms;
int len = arr.Length;
if (len == 0)
return;
System.Text.StringBuilder sb = new System.Text.StringBuilder();
int rows = (int) (arr.Length / 16);
int cols = 16;
sb.Append("--------- DUMPING ");
sb.Append(what);
sb.Append(" --------\n\r");
sb.Append(" \t");
for(int j = 0; j < cols; j++)
sb.AppendFormat(_settings.fmt_2digits+" ",j);
sb.Append("\n\r \t");
for(int j = 0; j < cols; j++)
sb.Append("---");
sb.Append("\n\r");
string asciistr = "";
for (int i = 0; i < rows+1; i++) // indice di riga
{
int offset = cols*i;
sb.AppendFormat(_settings.fmt_4digits+"\t",offset);
for (int j = 0; j < cols; j++)
{
if ((offset+j) < len)
{
asciistr +=
(
(arr[offset+j] > 31 )
&&
(arr[offset+j] < 127 )
)
? Encoding.ASCII.GetString(arr,offset+j,1) : ".";
sb.AppendFormat(_settings.fmt_2hex+" ", arr[offset+j]);
}
else
sb.Append(" ");
//break;
}
sb.AppendFormat("\t{0}", asciistr);
sb.Append("\n\r");
asciistr = "";
}
_loggerwrapper.Log(sb);
}
自然地,此方法处于最低级别,并且转储可以在序列化等上下文中进行,例如
private void TraceDump(MemoryStream ms, string what)
{
ms.Position = 0;
TraceDump(ms.ToArray(),what);
}
输出
-------- DUMPING mess RX --------
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
------------------------------------------------
0000 0d 0a ..
如你所见,输出类似于十六进制编辑器,简化了运行时数据读取。
命名空间
为此工作,你必须声明使用一些命名空间,例如这些
using System;
using System.Text;
用法
使用方法非常简单
// don't forget to use the System.Runtime.Seriliazation
MemoryStream stream = new MemoryStream()
MyObject myobject = new MyObject()
...
... do something
...
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, myobject);
Console.Write(TraceDump(_myArrayofBytes, "my object examined" );
我不想编写关于格式化类的教程,也许将来会,但可视化数据如何以及如何存储在流中是此技巧的范围。
你可以使用众所周知的 Trace.Write
方法在 Visual Studio 200x 的 Trace 中转储。
System.Diagnostics.Trace.Write(TraceDump(_myArrayofBytes, "my object examined" );
else
Console.Write(TraceDump(_myStream, "my object examined" );
关注点
对象是可序列化的吗?哦!所有对象都可以通过实现 ISerializable
接口来实现;然后人们可以将对象序列化到 MemoryStream
中,并转储它!除了你可以使用的可用性之外,没有特别的兴趣点!