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

📄 dcbertlv.h

📁 ASN.1解析解码工具,可以解析各种ASN.1格式的文件,并对相应的BER文件解码
💻 H
字号:
/****************************************************************************************
* Copyrights  2006,深圳天源迪科信息技术股份有限公司
*
* All rights reserved.
*
* Filename:	DCBerTlv.h		
* Indentifier:		
* Description:	
* Version:		V1.0
* Author:		wangbin
* Finished:	2007年6月18日
* History:
******************************************************************************************/
#ifndef _DIC_DCBerTlv_h_
#define _DIC_DCBerTlv_h_

#include "berdecoder/ber_tlv_tag.h"
#include <exception>

#define DICASN1P_DEFAULT_BUF_LEN 64
#define DICASN1P_MAX_STRUCTURE_LEN 8192
#define DICASN1P_TREE_BUF_SIZE 1

namespace dicasn1p
{
/*------------------------------------------------------------------------------------------------*/

class DCDecodeException:public std::exception
{
public:
	DCDecodeException(const char *fmt,...);
	virtual const char *what();
private:
	char m_buf[512];
};
/*------------------------------------------------------------------------------------------------*/
#define DICASN1P_DCBerTlv_RETURN_BUFFER_LEN 512

class DCBerTlv
{
public:
	enum asn_tag_class tag_class;
	int tag;
	ssize_t length;
	bool constructed;
	char *value;
	asn1p_expr_t *reference;
public:
	DCBerTlv(size_t buf_len = DICASN1P_DEFAULT_BUF_LEN,size_t max_len = DICASN1P_MAX_STRUCTURE_LEN);
	~DCBerTlv();
	ssize_t fromBuffer(const void* bufptr,size_t buflen);
	const char *getTagInfo();
private:
	typedef enum {none,read_tag,read_len,read_value} T_status;
	size_t m_buf_len,m_max_len;
	char *m_buf;
	size_t m_read_len;
	T_status m_status;
	char m_sRetValue[DICASN1P_DCBerTlv_RETURN_BUFFER_LEN];

	void release();
	void finish();
	size_t save(const char* bufptr,size_t buflen);
	void clear();
};
/*------------------------------------------------------------------------------------------------*/

template <typename T> class DCTreeNode
{
public:
	T *data;
	DCTreeNode<T> *next;			//下一个兄弟节点
	DCTreeNode<T> *head;			//子节点链的第一个,即 first child
	DCTreeNode<T> *tail;			//子节点链的最后一个,即 last child
	int depth;

public:
	DCTreeNode(T*,int depth = 0);
	~DCTreeNode();
	DCTreeNode<T>* addChild(T*);
	T* removeFirst();
};

typedef DCTreeNode<DCBerTlv> DCBerTlvNode;

/*------------------------------------------------------------------------------------------------*/

class DCTlvFileBuf
{
public:
	DCTlvFileBuf(FILE *fp);
	~DCTlvFileBuf();
	DCTreeNode<DCBerTlv> *read_tlv_tree();
private:
	char m_buf[DICASN1P_TREE_BUF_SIZE];
	FILE *m_fp;
	size_t m_used,m_length;

	int read_file();
};
/*------------------------------------------------------------------------------------------------*/


//************************************
// Method:    buffer_to_tlv_tree
// FullName:  dicasn1p::buffer_to_tlv_tree
// Access:    public 
// Returns:   ssize_t
// 返回值的含义:	r>0 时,表示使用了r字节,而后面的(buflen-r)字节是下一棵树才能用到的
//					r=0 时,表示不够解码一棵树,需要更多字节来解码,并把当前的 buflen 个字节
//						缓存在当前的节点中
//					r<0 时,表示解码过程中出错,或者数据不正确
// Qualifier:
// Parameter: const void* bufptr				二进制编码地址
// Parameter: size_t buflen						二进制编码长度
// Parameter: DCTreeNode<DCBerTlv> **pRoot		树根指针
// 这个函数的作用是把一段 ber 二进制码解码成一个树型结构
//************************************
ssize_t buffer_to_tlv_tree(const void* bufptr,size_t buflen,DCTreeNode<DCBerTlv> **pRoot);
//************************************
// Method:    tlv_tree_free
// FullName:  dicasn1p::tlv_tree_free
// Access:    public 
// Returns:   void
// Qualifier: 删除树的时候调用,类似于析构函数
// Parameter: DCTreeNode<DCBerTlv> *root
//************************************
void tlv_tree_free(DCTreeNode<DCBerTlv> *root);
int get_universal_tag_name(char *name,size_t namelen,asn1c_integer_t tag_value);
/*------------------------------------------------------------------------------------------------*/
#define DCASN1P_NODE_FOR(var,node) \
	for (var=(node)->head;var;var = var->next)

template <typename T> DCTreeNode<T>::DCTreeNode( T* data,int depth)
{
	this->data = data;
	this->next = NULL;
	this->head = NULL;
	this->tail = NULL;
	this->depth = depth;
}
template <typename T> DCTreeNode<T>::~DCTreeNode( )
{
	DCTreeNode<T> *node;
	DCASN1P_NODE_FOR(node,this)
	{
		delete node;
	}
}
template <typename T> DCTreeNode<T>* DCTreeNode<T>::addChild( T* data)
{
	DCTreeNode<T> *newNode = new DCTreeNode<T>(data,depth +1);
	if(NULL == this->head)
	{
		this->head = newNode;
		this->tail = newNode;
	}
	else
	{
		this->tail->next = newNode;
		this->tail = newNode;
	}
	return newNode;
}
template <typename T> T* DCTreeNode<T>::removeFirst()
{
	if(NULL == this->head)
	{
		return NULL;
	}
	T* data = this->head->data;
	delete this->head;
	this->head = this->head->next;
	if(NULL == this->head)
	{
		this->tail = NULL;
	}
	return data;
}

/*------------------------------------------------------------------------------------------------*/

/*------------------------------------------------------------------------------------------------*/
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -