📄 testmain01.cpp
字号:
#include <stdio.h>
#include "dicasnutil/DCAsnParser.h"
#include "dicasnutil/DCAsnBerDecoder.h"
#include <string>
#define BUF_SIZE 1
using namespace dicasn1p;
using namespace std;
arg_t arg;
int showMember(asn1p_expr_t *member,int depth)
{
if (member == NULL)
return 0;
for (int i=0;i<depth;++i)
{
printf("\t");
}
DCAsnValue value(member->value);
DCAsnExpr expr(member);
string sTypeName = expr.getTypeName();
string sDesc = expr.getTypeName();
string sValue = expr.getValue();
sValue = asn1f_printable_value(member->value);
printf("member:[%s],desc:[%s],value:[%s]",
member->Identifier,sDesc.c_str(),"");//sValue.c_str() );
if (AMT_TYPEREF == member->meta_type)
{
arg.expr = member;
arg.mod = NULL;
member->rhs_pspecs = asn1f_find_terminal_type(&arg,member);
if(member->rhs_pspecs)
printf(",right:[%s]",member->rhs_pspecs->Identifier);
}
printf("\n");
TQ_FOR(member,&(member->members),next)
{
showMember(member,depth+1);
}
return 0;
}
int ShowBuffer(const char *buf,size_t buflen,int depth = 0)
{
ber_tlv_tag_t tag;
ber_tlv_len_t len;
int is_constr = -1;
size_t used = 0,lastused=0;
static DCBerTlv tlv;
char *tmp;
while((lastused = tlv.fromBuffer(buf+used,buflen-used) ) > 0)
{
used += lastused;
for (int i=0;i<depth;++i)
{
printf("\t");
}
printf("tag:[%d],length:[%d],used:[%d]",tlv.tag,tlv.length,used);
if (tlv.constructed)
{
printf("\n");
tmp = (char*)malloc(tlv.length);
memcpy(tmp,tlv.value,tlv.length);
ShowBuffer(tmp,tlv.length,depth +1);
free(tmp);
}
else
{
printf(",value:");
outhexbuf(tlv.value,tlv.length);
}
}
return 0;
}
int ShowNode(DCTreeNode<DCBerTlv> *node)
{
for (int i=0;i<node->depth;++i)
{
printf("\t");
}
printf("tag:[%d],length:[%d],%s",node->data->tag,node->data->length,node->data->getTagInfo());
if (node->head)
{
DCTreeNode<DCBerTlv> *child;
printf("\n");
DCASN1P_NODE_FOR(child,node)
{
ShowNode(child);
}
}
else
{
printf(",value:");
outhexbuf(node->data->value,node->data->length);
printf("\n");
}
return 0;
}
int ShowNode(DCAsnBerValue *value)
{
int i=0;
for (i=0;i<value->depth;++i)
{
printf("\t");
}
printf("name:[%s]",value->name.c_str() );
if (value->value_type == DCAsnBerValue::TYPE_BASIC)
{
DCBasicValue* basic_value = (DCBasicValue*)value;
printf(",value:");
outhexbuf( basic_value->buf,basic_value->size );
printf("\n");
return 0;
}
printf("\n");
DCStructValue *struct_value = (DCStructValue*)value;
for (i=0;i<struct_value->members.size(); ++i)
{
ShowNode(struct_value->members[i]);
}
return 0;
}
int main(int argc,char *argv[])
{
asn1p_t *res = NULL;
asn1p_module_t *module;
asn1p_debug = 0;
asn1p__flex_debug = 0;
/* asn1p_in = fopen("E:\\wangbin\\study\\asn\\asn1c-0.9.21\\wbtest\\98-attribute-class-OK.asn1","r");
*/
#ifdef WIN32
asn1p_in = fopen("E:\\wangbin\\study\\asn\\files\\alcatel_cs_r4_01.asn1","r");
#else
asn1p_in = fopen("/public/agm/work/asn1c/asnfile/alcatel/alcatel_cs_r4_01.asn1","r");
#endif
asn1p_parse(&res);
fclose(asn1p_in);
if(res == NULL)
{
return -1;
}
if(asn1f_process(res,A1F_NOFLAGS,NULL) < 0)
return -1;
arg.asn = res;
arg.mod = NULL;
arg.expr = NULL;
TQ_FOR(module,&(res->modules),mod_next)
{
printf("module name is [%s]\n",module->ModuleName);
asn1p_expr_t *member;
TQ_FOR(member,&(module->members),next)
{
if (member->Identifier && strcmp(member->Identifier,"CallEventRecord") == 0)
{
//找出需要的类型
arg.expr = member;
}
// showMember(member,1);
}
}
// asn1print(res, (asn1print_flags)0 );
#ifdef WIN32
FILE *fp = fopen("E:\\wangbin\\study\\asn\\files\\CDR.209","rb");
#else
FILE *fp = fopen("/public/agm/work/asn1c/asnfile/berfile/CDR.176","rb");
#endif
char buf[BUF_SIZE];
int rd_size;
DCTreeNode<DCBerTlv> *root = NULL;
DCTlvFileBuf tlv_buf(fp);
// arg.mod = asn1f_lookup_module(&arg,"TS32205-DataTypes",NULL);
DCAsnBerValue *value;
//构造有名类型树
value = DCAsnBerValue::fromExpr(&arg);
try
{
//循环从话单文件中取记录,放到tlv树中
while(root = tlv_buf.read_tlv_tree() )
{
///*
//将有名类型树与tlv树相匹配
value->fromNode(root);
// tlv_tree_fix(&arg,root);
ShowNode(root);
//查找所需结点
DCBerTlvNode * node = find_child_member_by_path(root,"*.location.locationAreaCode");
if(node)
{
printf("--------------------------\n");
ShowNode(node);
printf("--------------------------\n");
}
//*/
/*
value->fromNode(root);
ShowNode(value);
*/
//析构tlv树
tlv_tree_free(root);
root = NULL;
}
}
catch (DCDecodeException& e)
{
printf("error:[%s]\n",e.what() );
if(root)
tlv_tree_free(root);
}
//删除有名类型树
delete value;
root = NULL;
asn1p_delete(res);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -