TLV 格式及編譯碼示例

2021-06-20 06:02:28 字數 3309 閱讀 8093

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...