📄 dcbertlv.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 + -