写通信程序常常需要把发出和收到的包记录到log文件,而最常用的记录方式就是16进制和ASCII码左右对照的方式,
C代码 :
</>code
- 1: short DebugASCII( char *buf1, int leng, int line)
</>code
- 2: {
</>code
- 3: int i, j=0;
</>code
- 4: char s[100], temp[5];
</>code
- 5:
</>code
- 6: printf( "Debug Information from Line: %04d\n", line);
</>code
- 7:
</>code
- 8: for( i=0; i<leng; i++)
</>code
- 9: {
</>code
- 10: if ( j==0)
</>code
- 11: {
</>code
- 12: memset( s, ' ', 84);
</>code
- 13: sprintf(temp, " %03d:",i );
</>code
- 14: memcpy( s, temp, 5);
</>code
- 15: sprintf(temp, ":%03d",i+15 );
</>code
- 16: memcpy( &s[72], temp, 4);
</>code
- 17: }
</>code
- 18: sprintf( temp, "%02X ", (unsigned char)buf1[i]);
</>code
- 19: memcpy( &s[j*3+5+(j>7)], temp, 3);
</>code
- 20: if ( isprint( buf1[i]))
</>code
- 21: {
</>code
- 22: s[j+55+(j>7)]=buf1[i];
</>code
- 23: }
</>code
- 24: else
</>code
- 25: {
</>code
- 26: s[j+55+(j>7)]='.';
</>code
- 27: }
</>code
- 28: j++;
</>code
- 29: if ( j==16)
</>code
- 30: {
</>code
- 31: s[76]=0;
</>code
- 32: printf( "%s\n", s);
</>code
- 33: j=0;
</>code
- 34: }
</>code
- 35: }
</>code
- 36: if ( j)
</>code
- 37: {
</>code
- 38: s[76]=0;
</>code
- 39: printf( "%s\n", s);
</>code
- 40: }
</>code
- 41: }
C#代码:
</>code
- 1: string ToPrintLog = LogHex ( 16, 8, message );
</>code
- 2:
</>code
- 3: public static string LogHex ( int lineWidth, int spaceIndent, byte[] data )
</>code
- 4: {
</>code
- 5: if ( data == null ) return null;
</>code
- 6:
</>code
- 7: string temp;
</>code
- 8: string line = String.Empty;
</>code
- 9:
</>code
- 10: StringBuilder sb = new StringBuilder ();
</>code
- 11: int j = 0;
</>code
- 12:
</>code
- 13: for ( int i = 0; i < data.Length; i++ )
</>code
- 14: {
</>code
- 15: temp = data[i].ToString ( "X2" ).PadLeft ( 2, '0' ); //0xce -> "CE"
</>code
- 16:
</>code
- 17: if ( j == 0 )
</>code
- 18: line = temp;
</>code
- 19: else
</>code
- 20: {
</>code
- 21: if ( (j+1) % spaceIndent == 0 )
</>code
- 22: line = line.Insert ( ( j >= spaceIndent ) ? 2 * j + 1 : ( 2 * j ), temp+" " );
</>code
- 23: else
</>code
- 24: line = line.Insert ( ( j >= spaceIndent ) ? 2 * j + 1 : ( 2 * j ), temp );
</>code
- 25: }
</>code
- 26:
</>code
- 27: if ( data[i] >= 0x30 && data[i] <= 0x7E )
</>code
- 28: {
</>code
- 29: temp=( (char)data[i] ).ToString ();
</>code
- 30: }
</>code
- 31: else
</>code
- 32: {
</>code
- 33: temp= "." ;//invisible
</>code
- 34: }
</>code
- 35:
</>code
- 36: line = line.Insert ( line.Length, temp );
</>code
- 37:
</>code
- 38: j++;
</>code
- 39:
</>code
- 40: if ( j == lineWidth )
</>code
- 41: {
</>code
- 42: sb.AppendLine ( line );
</>code
- 43:
</>code
- 44: j = 0;
</>code
- 45:
</>code
- 46: line = String.Empty;
</>code
- 47: }
</>code
- 48: else
</>code
- 49: {
</>code
- 50: if ( i == data.Length - 1 )
</>code
- 51: {
</>code
- 52: int comCount = 1;
</>code
- 53:
</>code
- 54: if ( j >= spaceIndent )
</>code
- 55: comCount = 2 * lineWidth - 2 * j+1;
</>code
- 56: else
</>code
- 57: comCount = 2 * lineWidth - 2 * j +2;
</>code
- 58:
</>code
- 59: for ( int m = 0; m < comCount; m++ )
</>code
- 60: {
</>code
- 61: line = line.Insert ( ( j >= spaceIndent ) ? 2 * j +1 : ( 2 * j ), " " );
</>code
- 62: }
</>code
- 63: sb.AppendLine ( line );
</>code
- 64: }
</>code
- 65: }
</>code
- 66: }
</>code
- 67: return sb.ToString();
</>code
- 68: }
输出结果样例:
</>code
- 1: 14A654A 20476459 14A654A 20476459 .JeJ .GdY .JeJ .GdY
</>code
- 2: 6646A49 20202020 6646A49 20202020 edjI .... edjI ....
</>code
- 3: 21F4A65 4A204764 21F4A65 4A204764 ..Je J.Gd ..Je J.Gd
</>code
- 4: 565646A 49203130 565646A 49203130 Yedj I.10 Yedj I.10
</>code
- 5: 2202020 20202020 2202020 20202020 .... .... .... ....
如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛