轉自:
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打包解包效率高,省內存。