转自:
http://www.cnblogs.com/tml839720759/archive/2014/07/13/3841820.html

引子:

  前段时间在项目中第一次接触TLV,项目中用这种格式来传输图片,语音等。

关于TLV

  TLV是一种可变的格式,意为:Type类型, Lenght长度,Value值。Type:该字段是关于标签和编码格式的信息;
Length:该字段是定义数值的长度; Value:字段表示实际的数值。Type和Length的长度固定,一般那是2、4个字节(unsigned short
或 unsigned long ,具体用哪种编码和解析统一就行了,本文就取unsigned long类型);Value的长度有Length指定;
在介绍编码和解码方法之前,需要先了解一下大端和小端。由于网络字节序统一用的是大端,主机字节序列有的是大端,有的是小端,根据平台不同有所差异。所以在编码的时候需要用到两个函数:htonl:
主机字节序列转换成网络字节序列; ntohl: 网络字节序列转换成主机字节序列

编/解码

编码方法:

  1. 将类型type用htonl转换为网络字节顺序,指针偏移+4
  2. 将长度length用htonl转换为网络字节顺序,指针偏移+4
  3. 若值value数据类型为int、char、short,则将其转换为网络字节顺序,指针偏移+4;若值为字符串类型,写进后,指针偏移+length
  ……继续处理后面的tlv;

解码方法:

  1. 读取type 用ntohl转换为主机字节序得到类型,指针偏移+4
  2. 读取lengh用ntohl转换为主机字节序得到长度;指针偏移+4
  3. 根据得到的长度读取value,若value数据类型为int、char、short,用ntohl转换为主机字节序,指针偏移+4;若value数据类型为字符串类型,指针偏移+length
  ……继续处理后面的tlv;

TLV优点:

  1
一个编码值又称TLV(Type,Length,Value)三元组。编码可以是基本型或结构型,如果它表示一个简单类型的、完整的显式值,那么编码就是基本型
(primitive);如果它表示的值具有嵌套结构,那么编码就是结构型 (constructed)。
  2 TLV打包解包效率高,省内存。