tlv是一種可變格式,意思就是:
type型別, lenght長度,value值;
type和length的長度固定,一般那是2、4個位元組(這裡統一採用4個位元組);
value的長度有length指定;
編碼方法:
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;
型別(type)欄位是關於標籤和編碼格式的資訊;
長度 (length)字段定義數值的長度;
內容(value)字段表示實際的數值。
因此,乙個編碼值又稱tlv(type,length,value)三元組。編碼可以是基本型或結構型,如果它表示乙個簡單型別的、完整的顯式值,那麼編碼就是基本型 (primitive);如果它表示的值具有巢狀結構,那麼編碼就是結構型 (constructed)。
下面是我寫的乙個demo程式:
[cpp]view plain
copy
#include
#include
#include
#pragma comment(lib, "ws2_32")
enum
emtlvnodetype
; typedef
struct
_cat_info
cat_info,*lpcat_info;
class
ctlvpacket
~ctlvpacket()
bool
writeint(
intdata,
bool
bmoveptr =
true
)
bool
write(
const
void
*pdst,unsigned
intuicount)
bool
readint(
int*data,
bool
bmoveptr =
true
)
bool
read(
void
*pdst,unsigned
intuicount)
private
: char
*m_pdata;
unsigned int
m_uilength;
char
*m_penddata;
char
*m_pwriteptr;
char
*m_preadptr;
};
/*格式:
root l1 v
t l v t l v t l v
l1 的長度即為「t l v t l v t l v」的長度
*/int
tlv_encodecat(lpcat_info pcatinfo,
char
*pbuf,
int&ilen)
ctlvpacket enc(pbuf,ilen);
enc.writeint(emtlvnroot);
enc.writeint(20+12+12); //length
enc.writeint(emtlvname);
enc.writeint(12);
enc.write(pcatinfo->szname,12);
enc.writeint(emtlvage);
enc.writeint(4);
enc.writeint(pcatinfo->iage);
enc.writeint(emtlvcolor);
enc.writeint(4);
enc.writeint(pcatinfo->icolor);
ilen = 8+20+12+12;
return
0;
} int
tlv_decodecat(
char
*pbuf,
intilen, lpcat_info pcatinfo)
ctlvpacket encdec(pbuf,ilen);
intitype;
intisum,ilength;
encdec.readint(&itype);
if(emtlvnroot != itype)
encdec.readint(&isum);
while
(isum > 0)
} return
0;
} int
main(
intargc,
char
* argv)
; cat_info cat;
memset(&cat,0,sizeof
(cat));
strcpy(cat.szname,"tom"
);
cat.iage = 5;
cat.icolor = 2;
iret = tlv_encodecat(&cat,buf,ilen);
if( 0 == iret )
else
memset(&cat,0,sizeof
(cat));
iret = tlv_decodecat(buf,ilen,&cat);
if( 0 == iret )
else
intiwait = getchar();
return
0;
}
本demo程式在vc2005環境下編譯通過,下面是執行結果截圖
**:
華為程式設計大賽 TLV編譯碼
描述 訊息的格式如下 1 一條訊息由乙個或多個基本資訊單元 information element ie組成。2 每個ie採用tlv編碼。tlv是tag length value的縮寫,它是一種變長資料的編譯碼,由tag,length value的長度 及value三個域組成。3 tag固定佔4個位...
TLV格式及編碼
幾乎所有的需要在卡片和終端之間傳送的資料都是tlv格式的.pboc文件裡並沒有對tlv編碼細節做具體說明,而emv的手冊裡雖有敘述,但並不詳細.我下面就要很詳細的分析tlv的編碼格式並給出相應的tlv解碼的偽 tlv是tag,length和value的縮寫.乙個基本的資料元就包括上面三個域.tag唯...
TLV格式及編碼
幾乎所有的需要在卡片和終端之間傳送的資料都是tlv格式的.tlv是tag,length和value的縮寫.乙個基本的資料元就包括上面三個域.tag唯一標識該資料元,length是value域的長度.value就是資料本身了.舉個例子,下面是乙個tlv格式的aid 應用識別符號 位元組串 9f0607...