【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文件,从而实现数据的导入,在导入数据的时候,如果是强类型的数据 ...
随机推荐
- iOS 性能优化总结
卡顿产生的原因 在 VSync信号到来后,系统图形服务会通过 CADisplayLink等机制通知 App,App主线程开始在 CPU中计算显示内容,比如视图的创建.布局计算.图片解码.文本绘制等.随 ...
- 苹果手机的SB系列(3)超级烦人的账户解锁?
不知道大家有没有这种体验,Iphone 每隔一段时间后账户就被锁定了,也不告诉你原因,就是要解锁? 我怎么感觉比做的比支付宝差多了,我注册支付宝十几年,也没有动不动就告诉了有安全原因,要解锁,要重置密 ...
- C# Thread Lock 笔记
多线程, 当使用共有变量时, 保持计算结果正确很重要: 看下面的例子: ; //private static object objlock = new object(); public static ...
- learning coap protocol
reference: http://coap.technology/spec.html
- c语言判断闰年作业
#include <stdio.h> int main() { int year,a; printf("请输人年份y:\n"); scanf("%d" ...
- 非root安装fastDFS及启动
引用https://www.cnblogs.com/zzw-zyba/p/10155781.html 非root安装部分 1.解包 [bdc@svr001 setup]$ tar -xvf lib ...
- keeplived
keepalived高可用集群. keepalived故障切换转移原理1vrrp协议:(vritual router redundancy protocol)虚拟路由冗余协议,2故障转移.keep ...
- selenium自动化实例: 多层框架中关于iframe的定位,以及select下拉框选择
对于一个自动化的初学者来说会很常见的遇到元素明明存在却始终定位不到, 从而导致脚本报错,当然定位不到元素的原因很多, 其中一种就是多层框架iframe导致的 下方截图示意: 下方为写脚本时候的示例并其 ...
- java第十次笔记
- 【推荐】HTML5 Word Cloud——中文词云
在线工具: http://timdream.org/wordcloud/# 源码: https://github.com/timdream/wordcloud