【TLV】非递归TLV数据解析
#include <stdio.h> #define X_LEN_OF_TAG_MAX ( 2 )
#define X_LEN_OF_LEN_MAX ( 2 ) struct st_tlv_t {
unsigned int TAG;
unsigned char isCustructed;
unsigned int valLen;
unsigned char *pVal; }; static int skipZeroBytes( unsigned char **pcur, unsigned char *end )
{
while( **pcur == && (*pcur < end) )
(*pcur)++; if( *pcur < end )
return ; return ;
} static int parseTag( unsigned char **pcur, unsigned char *end, struct st_tlv_t *tlv )
{
unsigned char *pp;
int lenOfTag;
int i; if( *pcur >= end )
return ; pp = *pcur; lenOfTag = ;
if( (*pp++ & 0x1f) == 0x1f )
{
do {
if( pp >= end )
return ; lenOfTag++;
} while( (*pp++) & 0x80 );
}
if( lenOfTag > X_LEN_OF_TAG_MAX )
{
return ;
} tlv->isCustructed = ( **pcur & ( << ) ) ? : ; tlv->TAG = ;
for( i = ; i < lenOfTag; i++ )
{
tlv->TAG <<= ;
tlv->TAG |= *(*pcur + i );
} (*pcur) += lenOfTag;
//printf("tlv->TAG:%x\r\n", tlv->TAG);
return ;
} static int parseLength( unsigned char **pcur, unsigned char *end, struct st_tlv_t *tlv )
{
unsigned char *pp;
int lenOfLen;
int i; if( *pcur >= end || **pcur == )
return ; pp = *pcur; if( *pp & 0x80 )
{
lenOfLen = *pp & 0x7F;
if( pp + lenOfLen >= end )
return ;
if( lenOfLen > X_LEN_OF_LEN_MAX )
return ;
pp++;
tlv->valLen = ;
for( i = ; i < lenOfLen; i++ )
{
tlv->valLen <<= ;
tlv->valLen |= *(pp + i );
}
(*pcur) += (lenOfLen+);
}
else
{
tlv->valLen = **pcur;
(*pcur)++;
}
//printf("tlv->valLen:%d\r\n", tlv->valLen);
return ;
} static int parseValue( unsigned char **pcur, unsigned char *end, struct st_tlv_t *tlv )
{
if( (*pcur + tlv->valLen) > end )
return ; tlv->pVal = ( unsigned char *)(*pcur); return ;
} int parseTlv( unsigned char *buffer, int length, struct st_tlv_t *tlv )
{
unsigned char *cur;
unsigned char *end; cur = buffer;
end = buffer + length; if( !skipZeroBytes( &cur, end ) )
return ; if( !parseTag( &cur, end, tlv ) )
return ; if( !parseLength( &cur, end, tlv ) )
return ; if( !parseValue( &cur, end, tlv ) )
return ; return ;
} int printTlv( struct st_tlv_t *tlv )
{
int i;
printf("\r\n[%x] len:%d\r\n", tlv->TAG, tlv->valLen);
for( i = ; i < tlv->valLen; i++ )
printf("%02x", tlv->pVal[i]);
printf("\r\n"); return ;
} int parseTlvXXX( unsigned char *buffer, int length, int reverse )
{
unsigned char *cur;
unsigned char *end;
struct st_tlv_t tlv; cur = buffer;
end = buffer + length; while( cur < end )
{
if( !parseTlv( cur, end-cur, &tlv ) )
return ; printTlv( &tlv ); // 如果是复合型的TAG,则进入复合TAG内部继续分析
if( tlv.isCustructed && reverse )
{
cur = tlv.pVal;
}
else // 如果是简单型的TAG,则分析下一个TAG
{
cur = tlv.pVal + tlv.valLen;
}
} if( cur > end )
return ; return ;
} int main( void )
{
int ret; unsigned char tlv_buf0[] = {
0x70,0x28,0x61,0x26,0x4f,0x07,0xa0,0x00,
0x00,0x03,0x33,0x01,0x01,0x50,0x0b,0x50,
0x42,0x4f,0x43,0x20,0x43,0x72,0x65,0x64,
0x69,0x74,0x87,0x01,0x01,0x9f,0x12,0x0a,
0x50,0x42,0x4f,0x43,0x20,0x44,0x45,0x42,
0x49,0x54,0x90,0x00
};
unsigned char tlv_buf1[] = {
0x00,0x00,0x00,
0x70,0x81,0x83,0x90,0x81,0x80,0x25,0x3c,
0x3c,0x1f,0xd9,0x92,0x8d,0x88,0x21,0x11,
0xa6,0xac,0x4c,0xa2,0x07,0xdf,0x93,0x10,
0x64,0x23,0x95,0xea,0x09,0x7b,0x3c,0xb1,
0x6d,0x51,0x76,0x53,0x35,0x38,0x03,0xc2,
0xc1,0x03,0x3e,0x4a,0xac,0xb9,0x73,0x5d,
0x2e,0x69,0xca,0x49,0x8f,0xeb,0x4c,0xc0,
0xae,0xe1,0xff,0xc7,0xf5,0x44,0x83,0x09,
0x3a,0x30,0xcc,0xbf,0x6b,0x20,0x11,0xd6,
0x09,0xe5,0x2f,0xd7,0x87,0x76,0xb6,0x6b,
0x6d,0x86,0x95,0xcb,0xc0,0x46,0x21,0x6b,
0xf8,0x1c,0x52,0xd5,0xc2,0xf9,0x47,0xde,
0xe3,0xad,0xd7,0x20,0x9a,0xb3,0x27,0xf2,
0x9c,0x10,0x6b,0xfa,0x0e,0x29,0x1d,0x9d,
0xab,0x00,0x91,0x06,0xf4,0x89,0xba,0x59,
0x43,0x6d,0xa9,0x46,0x75,0xdf,0x9d,0x31,
0xdc,0xaf,0xbd,0x6a,0xbe,0x20,
};
unsigned char tlv_buf2[] = {
0x6f,0x24,0x84,0x0e,0x31,0x50,0x41,0x59,
0x2e,0x53,0x59,0x53,0x2e,0x44,0x44,0x46,
0x30,0x31,0xa5,0x12,0x88,0x01,0x01,0x5f,
0x2d,0x08,0x7a,0x68,0x65,0x6e,0x66,0x72,
0x64,0x65,0x9f,0x11,0x01,0x01
}; ret = parseTlvXXX( tlv_buf0, sizeof(tlv_buf0), );
printf("0-parseTlvXX: %d\r\n", ret); ret = parseTlvXXX( tlv_buf1, sizeof(tlv_buf1), );
printf("1-parseTlvXX: %d\r\n", ret); ret = parseTlvXXX( tlv_buf2, sizeof(tlv_buf2), );
printf("2-parseTlvXX: %d\r\n", ret); return ;
}
【TLV】非递归TLV数据解析的更多相关文章
- C语言递归,非递归实现翻转链表
翻转链表作为,链表的常用操作,也是面试常遇到的. 分析非递归分析: 非递归用的小技巧比较多,很容易出错. 递归分析比较简单,在代码里面 代码: #include<stdio.h> #inc ...
- iOS - JSON 数据解析
iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...
- python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)
一.数据类型及解析方式 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数 ...
- cJONS序列化工具解读二(数据解析)
cJSON数据解析 关于数据解析部分,其实这个解析就是个自动机,通过递归或者解析栈进行实现数据的解析 /* Utility to jump whitespace and cr/lf *///用于跳过a ...
- 通读AFN①--从创建manager到数据解析完毕
流程梳理 今天开始会写几篇关于AFN源码解读的一些Blog,首先要梳理一下AFN的整体结构(主要是讨论2.x版本的Session访问模块): 我们先看看我们最常用的一段代码: AFHTTPSessio ...
- 非递归创建二叉树( C++队列 )
非递归按照 层序 创建二叉树,利用 队列(即可先进先出特点)存放已访问的结点元素的地址. 初始化:front=rear= -1: 每储存一个结点元素 rear+1 ,利用 rear%2==0 来使 f ...
- 排序算法练习--JAVA(插入、直接选择、冒泡、快速排序、非递归快速排序)
排序算法是数据结构中的经典算法知识点,也是笔试面试中经常考察的问题,平常学的不扎实笔试时候容易出洋相,回来恶补,尤其是碰到递归很可能被问到怎么用非递归实现... package sort; impor ...
- 先贴上代码:Random快排,快排的非递归实现
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为主元,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序.值得注意的是, ...
- 利用Aspose.Cell控件导入Excel非强类型的数据
导入Excel的操作是非常常见的操作,可以使用Aspose.Cell.APOI.MyXls.OLEDB.Excel VBA等操作Excel文件,从而实现数据的导入,在导入数据的时候,如果是强类型的数据 ...
随机推荐
- C#生成.tlb文件初认识
刚接手同事的代码,生成文件时,发现生成了一个对应的dll文件(应用程序中输出类型为类库),和一个对应的.tlb文件,但是报如下的错误: 那么.tlb文件是如何生成的呢? 选择项目->右键属性-& ...
- 学号 20175212 《Java程序设计》第4周学习总结
学号 20175212 <Java程序设计>第4周学习总结 教材学习内容总结 一. 子类与父类 父类中的private和友好访问权限的成员变量不会被子类继承.子类只继承父类中的protec ...
- css的position属性
position: relative:保持未定位前的位置不变,若给了left,top的值,那么就会相对于原来的位置进行移动 absolute:元素原先在正常文档流中所占的空间会关闭,就好像元素原来不存 ...
- 浅谈C中操作字符串函数的用法(一)
按照内核string.h中函数的顺序进行大概的介绍,若干函数会给出一个简单的例子.有不足之处还希望各位看到的留言告知. 一.memcpy: 函数原型:extern void * memcpy(void ...
- vue.js 自带阻止默认事件 阻止冒泡
<!-- 阻止单击事件冒泡 --> <a v-on:click.stop="doThis"></a> <!-- 提交事件不再重载页面 ...
- java AQS 一:
最近加班太多,很久没有更新博客了,周末看了下阿里大神并发的书籍,把知识点做个记录. 一:线程安全的定义 当多个线程并发访问某个类时,如果不用考虑运营环境下的调度和交替运行,且不需要额外的辅助,这里认为 ...
- Spring Boot:Thymeleaf 使用详解
Thymeleaf 介绍 简单说,Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完全替代 JSP .相较与其他的模板引擎,它有如下三个极吸引人的特点: 1 ...
- java-面向对象(公元2017-6-28)
1.面向对象 何为面向对象:编写程序的时候会提取相似的 特征,把这些相似的特征组织起来 类:相似的特征组织起来的类型. 泛指.可理解为模板 对象:属于类中的具体事物 ...
- Unity配置安卓开发环境
1. 首先要安装JDK,从网上下载即可,我用的版本如下图 注意:此时要保存JDK的路径信息,后面需要使用2. 配置环境变量,计算机右键点属性->高级->环境变量3. 在系统中新建环境变量 ...
- python全栈考题 3.30
1.执行Python 脚本的两种方式 1.>>python ../pyhton.py 2. >>python.py #必须在首行有 #!/usr/bin/env ...