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