65.9K
CodeProject 正在变化。 阅读更多。
Home

转储很容易

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (3投票s)

2004年8月27日

1分钟阅读

viewsIcon

25647

downloadIcon

2

一个用于轻松转储字节数组的小方法。

Sample screenshot

引言

在复杂的日志记录和异常捕获环境中,转储字节数组很有用。为此,任何程序员每次需要时都会编写自己的方法。

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 中,并转储它!除了你可以使用的可用性之外,没有特别的兴趣点!

© . All rights reserved.