⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testmain01.cpp

📁 ASN.1解析解码工具,可以解析各种ASN.1格式的文件,并对相应的BER文件解码
💻 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 + -