1 #include

2 #include

3 #include

4

5 #pragma comment(lib, "WS2_32")

6

7

8 //定义枚举类型常量,来填充Tpye字段,其中emTlvNRoot填充根TLV包的Type9 //emTlvName字段用于填充子TLV字段中名字的Type字段.emTlvAge,emTlvColor类似10 //此类型字段是为了TLV包解码时识别到底是哪个TLV包.进而解析出对应的数据.

11 enumemTLVNodeType12 {13 emTlvNNone = 0,14 emTlvNRoot, //根节点

15 emTlvName, //名字

16 emTlvAge, //年龄

17 emTlvColor //颜色 1 白色 2 黑色

18 };19

20

21

22 //定义要封装成TLV包的数据,包括名字,年龄,颜色。

23 typedef struct_CAT_INFO24 {25 char szName[12];26 intiAge;27 intiColor;28 }CAT_INFO,*LPCAT_INFO;29

30

31 //此类为TLC类,其中有四个成员函数,WriteInt和Write是用于32 //把原始数据封装为TLV包然后存入内存区块.即TLV包编码过程33 //而ReadInt和Read用于把内存区块的TLV包解析出来.即为TLV包的解码过程

34 classCTlvPacket35 {36

37 public:38

39 CTlvPacket(char *pBuf,unsigned intlen):40 m_pData(pBuf),m_uiLength(len),m_pEndData(m_pData+len),41 m_pWritePtr(m_pData),m_pReadPtr(m_pData) { }42

43 ~CTlvPacket() { }44

45

46 bool WriteInt(int data,bool bMovePtr = true)47 {48 int tmp =htonl(data);49 return Write(&tmp,sizeof(int));50 }51

52

53 bool Write(const void *pDst,unsigned intuiCount)54 {55 ::memcpy(m_pWritePtr,pDst,uiCount);56 m_pWritePtr +=uiCount;57 return m_pWritePtr < m_pEndData ? true : false;58 }59

60

61 bool ReadInt(int *data,bool bMovePtr = true)62 {63 Read(data,sizeof(int));64 *data = ntohl(*data);65 return true;66 }67

68

69 bool Read(void *pDst,unsigned intuiCount)70 {71 ::memcpy(pDst,m_pReadPtr,uiCount);72 m_pReadPtr +=uiCount;73 return m_pReadPtr < m_pEndData ? true : false;74 }75

76

77 private:78

79 char *m_pData;80

81 unsigned intm_uiLength;82

83 char *m_pEndData;84

85 char *m_pWritePtr;86

87 char *m_pReadPtr;88

89 };90

91 /*

92

93 格式:94 root L1 V95 T L V T L V T L V96

97 L1 的长度即为“T L V T L V T L V”的长度98

99 */

100

101

102 //此函数实现TLV编码过程

103 int TLV_EncodeCat(LPCAT_INFO pCatInfo, char *pBuf, int &iLen)104 {105

106 if (!pCatInfo || !pBuf)107 {108 return -1;109 }110

111

112 CTlvPacket enc(pBuf,iLen);113 enc.WriteInt(emTlvNRoot);114 enc.WriteInt(20+12+12); //length

115

116 enc.WriteInt(emTlvName);117 enc.WriteInt(12);118 enc.Write(pCatInfo->szName,12);119

120 enc.WriteInt(emTlvAge);121 enc.WriteInt(4);122 enc.WriteInt(pCatInfo->iAge);123

124 enc.WriteInt(emTlvColor);125 enc.WriteInt(4);126 enc.WriteInt(pCatInfo->iColor);127

128

129 iLen = 8+20+12+12;130

131 return 0;132

133 }134

135 //此函数实现TLV解码过程

136 int TLV_DecodeCat(char *pBuf, intiLen, LPCAT_INFO pCatInfo)137 {138

139 if (!pCatInfo || !pBuf)140 {141 return -1;142 }143

144

145 CTlvPacket encDec(pBuf,iLen);146 intiType;147 intiSum,iLength;148

149

150 encDec.ReadInt(&iType);151 if (emTlvNRoot !=iType)152 {153 return -2;154 }155 encDec.ReadInt(&iSum);156

157

158 //通过判断Type头字段对TLV包进行解析

159 while (iSum > 0)160 {161

162 encDec.ReadInt(&iType);//读取主TLV包的type头

163 encDec.ReadInt(&iLength);//读取主TLV包的length头

164

165 switch(iType) //此时buff指针移动到子TLV包.并解析子TLV的type头字段

166 {167

168 caseemTlvName:169 encDec.Read(pCatInfo->szName,12);170 iSum -= 20;171 break;172

173 caseemTlvAge:174 encDec.ReadInt(&pCatInfo->iAge);175 iSum -= 12;176 break;177

178 caseemTlvColor:179 encDec.ReadInt(&pCatInfo->iColor);180 iSum -= 12;181 break;182

183 default:184 printf("TLV_DecodeCat unkonwn error. \n");185 break;186

187 }188

189 }190

191 return 0;192

193 }194

195 //主函数

196 int main(int argc, char*argv[])197 {198

199 intiRet, iLen;200 char buf[256] = {0};201

202

203 CAT_INFO cat; //cat为定义的原始数据包括name,age,color

204 memset(&cat,0,sizeof(cat));//cat结构体初始化205

206 //对cat对象赋值

207 strcpy(cat.szName,"Tom");208 cat.iAge = 5;209 cat.iColor = 2;210

211 //实现对cat对象的编码,编码结果存储在buf中.

212 iRet = TLV_EncodeCat(&cat,buf,iLen);213

214

215 //TLV编码成功与否的判断

216 if ( 0 ==iRet )217 {218 printf("TLV_EncodeCat ok, iLen = %d. \n",iLen);219 }220 else

221 {222 printf("TLV_EncodeCat error \n");223 }224

225 //将cat结构置为0

226 memset(&cat,0,sizeof(cat));227

228 //TLV包解码过程,将解包后的数据存入cat结构体对象

229 iRet = TLV_DecodeCat(buf,iLen,&cat);230

231

232 //输出解包后的结构体数据

233 if ( 0 ==iRet )234 {235 printf("TLV_DecodeCat ok, cat name = %s, age = %d, color = %d. \n",cat.szName,cat.iAge,cat.iColor);236 }237 else

238 {239 printf("TLV_DecodeCat error, code = %d. \n", iRet);240 }241

242

243 int iWait =getchar();244

245 return 0;246 }

java嵌套tlv_TLV----Demo讲解相关推荐

  1. java 注解 demo_JAVA语言注解概念使用及Demo讲解

    本文主要向大家介绍了JAVA语言注解概念使用及Demo讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. java注解 概念 Java提供了一种原程序中的元素关联任何消息和任何元数据 ...

  2. Java高效输入输出流讲解

    Java高效输入输出流讲解 Java中执行输出和输入操作,需要通过IO流.例如最常见的System.out.println()就是一个输出流.IO流的类比较多,但核心体系就是由File. InputS ...

  3. java 嵌套对象转xml_Gson对Java嵌套对象和JSON字符串之间的转换 | 学步园

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,具有良好的跨平台特性.近几年来已经和XML一样成为C/S架构中广泛采用的数据格式.有关JSON的更多知识, ...

  4. Java反射机制demo(四)—获取一个类的父类和实现的接口

    2019独角兽企业重金招聘Python工程师标准>>> Java反射机制demo(四)-获取一个类的父类和实现的接口 1,Java反射机制得到一个类的父类 使用Class类中的get ...

  5. Commit failed with error: pathspec 'src/main/java/com/leo/demo/juctest/test.java' did not match any

    Git 提交报错:Commit failed with error: pathspec 'src/main/java/com/leo/demo/juctest/test.java' did not m ...

  6. 支付宝即时到账接口开发 - DEMO讲解

    支付宝即时到账接口开发 - DEMO讲解 环境要求 PHP5.0以上,且需要开启curl.openssl. 文档地址: https://doc.open.alipay.com/doc2/detail? ...

  7. java 嵌套类: Nested classes

    java 嵌套类: Nested classes 嵌套类分类 静态嵌套类 非静态嵌套类 普通内部类: Common classes 局部内部类: Local classes 匿名内部类: Anonym ...

  8. python if else 嵌套格式_python中if嵌套命令实例讲解

    一.嵌套命令计算机执行的顺序 缩进相同的命令处于同一个等级,第一步,计算机就要按顺序一条一条地执行命令. 1.先给score赋值: 2.因为if和else是只能留一个的互斥关系,if和else下的代码 ...

  9. 大道至简 知易行难 JAVA 完成WebSocket demo 用GoEasy实现Hello world

    一个项目在方向.目标和运营理念已经定义了的时候,我们会去考虑项目本身的周期和开发成本.当然,所有的公司都会在项目能够达成目标的同时尽量减少人力成本和时间成本,其中,就会有用到三方的软件和框架. 大道至 ...

  10. JAVA 完成WebSocket demo 用GoEasy实现Hello world

    一个项目在方向.目标和运营理念已经定义了的时候,我们会去考虑项目本身的周期和开发成本.当然,所有的公司都会在项目能够达成目标的同时尽量减少人力成本和时间成本,其中,就会有用到三方的软件和框架. 大道至 ...

最新文章

  1. 6D位姿估计Point Pair Feature (PPF)算法详解
  2. Mybatis中 $ 和 # 千万不要乱用!
  3. 嵌入式Linux系统中的.lds链接脚本基础
  4. loj 1251(2-sat + 输出一组可行解)
  5. P2375-[NOI2014]动物园【KMP,字符串】
  6. python内建函数和工厂函数的整理
  7. 下拉推广系统立择火星推荐_下拉词删除都择火星下拉
  8. Reporting Services Internal Error(诡异的问题)-【转载】
  9. java key value 数据类型_JAVA面试锦囊(一)
  10. Android ThreadPool
  11. 【JS】WPS宏编辑器
  12. js function
  13. Python金融大数据分析——第11章 统计学(2)投资组合优化 笔记
  14. Revisiting Time Series Outlier Detection: Definitions and Benchmarks
  15. 零信任是一次绝地反击
  16. Mac怎么创建加密文件夹
  17. strom及DRPC性能测试与改进
  18. php --interface接口的使用方法
  19. 叉包舍 - PPPoE之常见拨号错误代码及处理
  20. docker swam 集群实现负载均衡

热门文章

  1. iPhone开机键坏了如何开机
  2. 微信上线“企业信用查询”帮你轻松识别“老赖”企业
  3. 15款宝藏手机APP,保证你用一次就彻底爱上
  4. 画论36 何良俊《四友斋画论》
  5. 红旗Linux刻录到U盘,安装红旗Asianux_openEuler 8.1(欧拉版)的方法
  6. vue点击事件转圈等待返回取消
  7. 微信小程序vant异步获取自定义省市区三级联动(附地区数据库)
  8. 复旦大学心理学教授解释请笔仙玄秘《玄秘幻术》简介
  9. 每周学算法/读英文/知识点心得分享 8.11
  10. IDEA常用快捷键和debug常用调试技巧