Diameter消息解析工具

 1 #ifndef PUBLIC_H_INCLUDED
 2 #define PUBLIC_H_INCLUDED
 3 
 4 #include <stdio.h>
 5 #include <string.h>
 6 
 7 
 8 #ifdef _DEBUG_
 9 
10 #define debug()      fprintf(stderr, __VA_ARGS__)
11 #define ASSERT(x , ) do {                            \
12         if( !( x ) )                                    \
13         {                                               \
14             fprintf(stderr, "LINE:%d,FUNC:%s ,TIME:%s\n"\
15                 , __LINE__, __func__, __TIME__);        \
16             fprintf( stderr, __VA_ARGS__);              \
17             exit( 1 );                                  \
18         }                                               \
19 } while ( 0 )
20 #else
21 #define debug()
22 #define ASSERT(x , )
23 #endif
24 
25 
26 
27 
28 unsigned int ascii_char_maps[ 256 ] ;
29 
30 
31 
32 #endif 
33 
#include "public.h"

void init_ascii_char_maps()
{
    int i ;
    memset( ascii_char_maps , -1, sizeof ascii_char_maps);
    for( i = 'a' ; i < 'g' ; i++)
    {
        ascii_char_maps[ i ] = i - 'a' + 0x0a;
    }
    for( i = 'A' ; i < 'G' ; i++)
    {
        ascii_char_maps[ i ] = i - 'A' + 0x0a;
    }
    for( i = '0' ; i <= '9' ; i++ )
    {
        ascii_char_maps[ i ] = i - '0' ;
    }
}


/**
*  "A0" ==> 0xA0
*  两个字节数据 --> 一个字节数值
*/

int  __HexStrToHexInt( const char *szSrc , unsigned char *chDst )
{
    unsigned int tmp_val;
    *chDst = 0;
    tmp_val = ascii_char_maps [ szSrc[0] ] ;
    ASSERT( tmp_val != -1 , "unknown character value[%x]\n" , szSrc[0]);
    *chDst = (tmp_val << 4);
    tmp_val = ascii_char_maps [ szSrc[1] ] ;
    ASSERT( tmp_val != -1 , "unknown character value[%x]\n" , szSrc[1]);
    *chDst += tmp_val;
    debug("[%c,%c]==>[%02X]\n",szSrc[0],szSrc[1], *chDst);
    return 0;
}

/**
*  "A0B0C0" ==> 0xA0B0C0
*  2n个字节数据 --> n个字节数值(n >= 0)
*/
int  HexStrToHexInt( const char *szSrc , unsigned char *chDst , int *length )
{
    int i,j,ret ;
    int src_len = strlen(szSrc);
    const char *pSrc;
    char *pDst;
    if( src_len % 2 != 0 )
    {
        fprintf( stderr, "szSrc length[%d] error! \n", src_len);
        return -1;
    }
    if( src_len == 0 )
    {
        chDst[0] = 0;
        *length = 0;
        return 0;
    }

    for( pSrc = szSrc, pDst = chDst ; (pSrc - szSrc) < src_len ; pSrc  += 2, pDst++ )
    {
        ret = __HexStrToHexInt( pSrc , pDst );
        if( ret < 0 )
        {
            fprintf( stderr, "__HexStrToHexInt return [%d] error\n", ret );
            return -2;/*内部字符串格式错误,存在非法字符*/
        }
    }
    *length = src_len/2;
    chDst[*length] = 0;
    return 0;
}

 1
 #include "public.h"
 2 
 3 /*the attribute struct of message head*/
 4 typedef struct _dcca_msg_head_cmd_t
 5 {
 6         unsigned int    r    :1;  /**< Request */
 7         unsigned int    p    :1;  /**< Proxiable */
 8         unsigned int    e    :1;  /**< Error */
 9         unsigned int    t    :1;  /**< Potentially re-transmitted */
10         unsigned int    rsvd :4;  /**< Reserved */
11         unsigned int    uiCmdCode:24;   /*Command-Code */
12 } DCCA_MSG_CMD_T;
13 
14 
15 /*the struct of message head*/
16 
17 typedef struct  _dcca_msg_head_t{
18         unsigned char   ucVer;                  /*Version*/
19         unsigned int    uiLen:24;               /*Message Length*/
20         DCCA_MSG_CMD_T  command;                        /*command flags */
21         unsigned int    uiAppID;                /*Application-ID*/
22         unsigned int    uiHbh;                  /*Hop-by-Hop Identifier*/
23         unsigned int    uiEte;                  /*End-to-End Identifier*/
24 } DCCA_MSG_HEAD_T ;
25 
26 
27 void  display_msg_head(  DCCA_MSG_HEAD_T *p_msg_head )
28 {
29     DCCA_MSG_HEAD_T *p;
30     p = p_msg_head;
31     fprintf(stderr, "ver:%d,msg_len:%x\nflag{r:%d,p:%d,e:%d,t:%d,rsvd:%d},command_code:%d\n",
32             p->ucVer,p->uiLen,p->command.r,p->command.p,p->command.e, p->command.t, p->command.rsvd, p->command.uiCmdCode);
33 }
34 
35 #define DCCA_MSG_HEAD_LEN  sizeof( DCCA_MSG_HEAD_T )
36 
37 /*the attribute struct of message head*/
38 typedef struct _dcca_avp_node_flag_t
39 {
40         unsigned int    v    :1;  /**< Vender-ID flag */
41         unsigned int    m    :1;  /**< Must 指明对该AVP的支持是否是必需的 */
42         unsigned int    p    :1;  /**< 指明为保证端到端安全需要加密 */
43         unsigned int    rsvd :5;  /**< Reserved */
44 } DCCA_AVP_FLAG_T;
45 
46 
47 
48 typedef struct  _dcca_avp_node_head_t {
49         unsigned int    avp_code;  /*AVP Code*/
50         DCCA_AVP_FLAG_T flag ; /*V M P r r r r r*/
51         unsigned int    avp_length; /*AVP Length*/
52         unsigned int    verdor_id;      /*制造商ID*/
53 } DCCA_AVP_CODE_HEAD_T;
54 
55 #define DCCA_AVP_CODE_HEAD_LEN  sizeof( DCCA_AVP_CODE_HEAD_T )
56 
57 int main( int argc ,char *argv[] )
58 {
59 
60         int i,len;
61         
62         char *szSrc = "0100035CC000011000000004080004C5F280C82B000001074000003443434747534E3031424857312E636D63632E636F6D3B333631323539303636323B32323635363B3239393137000001024000000C00000004000001084000001D43434747534E3031424857312E636D63632E636F6D0000000000012840000010636D63632E636F6D0000011B40000010636D63632E636F6D00000125400000166A696C696E2E636D63632E636F6D0000000001A04000000C000000020000019F4000000C00000003000001CD400000156770727340636D63632E636F6D000000000001164000000CD63F4A6E000000374000000CD753C9CA000001BB4000002C000001C24000000C00000000000001BC4000001538363133373034343439353836000000000001BB4000002C000001C24000000C00000001000001BC4000001734363030303434323830393536313200000001C74000000C00000001000001C840000064000001B540000008000001BE40000038000001A54000001000000000000001880000019C4000001000000000000000D00000019E4000001000000000000000B8000001B04000000C7735940900000368C0000010000028AF00000004000001CA00000024000001CB0000000C00000000000001CC00000010686992005292918700000369C000017C000028AF0000036AC0000170000028AF00000002C0000010000028AF17346C9B00000003C0000010000028AF00000000000004CBC0000012000028AF00010AE4D18A000000000005C0000027000028AF30352D32333932316639313936393739373734666239373937303000000004CCC0000012000028AF0001DDB1CC0D00000000034FC0000012000028AF0001DDB1CC3100000000034EC0000012000028AF0001C0A82090000000000008C0000011000028AF343630303000000000000009C0000011000028AF34363030300000000000000AC000000D000028AF350000000000001E4000000D636D6E65740000000000000CC000000D000028AF300000000000000DC0000010000028AF3034303000000012C0000011000028AF343630303000000000000017C000000E000028AF23000000000003ECC000001A000028AF755F705F636D63635F636D6E6574000000000016C0000014000028AF0064F00043E780F300000015C000000D000028AF02000000";
63         
64         char szDst[ 4096 ];
65 
66         DCCA_MSG_HEAD_T dcca_msg_head;
67 
68         init_ascii_char_maps();
69         memset( &dcca_msg_head, 0, sizeof ( DCCA_MSG_HEAD_T ));
70         len = 0;
71         memset( szDst, 0, sizeof( szDst ) );
72         FILE *fp = fopen( "./a.txt" , "wb+");
73         for( i = 0 ;i < 2; i++)
74         {
75                 HexStrToHexInt(szSrc, szDst,&len);
76 /**/
77                 fwrite( szDst, len , 1 ,fp );
78 /**/
79 
80                 memcpy( &dcca_msg_head, szDst, DCCA_MSG_HEAD_LEN );
81                 display_msg_head( &dcca_msg_head );
82         }
83         fclose(fp);
84 
85         return 0;
86 }
87 

posted on 2014-07-07 17:26 编码者-thinker 阅读(828) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2014年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜