TLV格式及編碼

2021-06-01 19:29:06 字數 1576 閱讀 6077

**:

幾乎所有的需要在卡片和終端之間傳送的資料都是tlv格式的. pboc文件裡並沒有對tlv編碼細節做具體說明, 而emv的手冊裡雖有敘述,但並不詳細. 我下面就要很詳細的分析tlv的編碼格式並給出相應的tlv解碼的偽**.

tlv是tag, length和value的縮寫.乙個基本的資料元就包括上面三個域. tag唯一標識該資料元, length是value域的長度. value就是資料本身了. 舉個例子, 下面是乙個tlv格式的aid(應用識別符號)位元組串」9f0607a0000000031010」, 其中9f06是tag, 07是長度,  a0000000031010就是aid本身的值了.

對於程式編寫人員來說,我們關心的是,如果有類似上面這樣的一串tlv編碼的位元組串從卡片傳過來, 怎麼樣從中提取我們想要的資料. 這就牽扯出tlv解碼的問題了.

其中ber-tlv編碼是iso定義一種規範, 然後到了pboc/emv裡被簡化了, **被簡化了呢?舉乙個例子, tag域在iso裡可以有多個位元組,而pboc/emv裡規定只用前兩個位元組. 我下面要講的tlv解碼就是基於pboc/emv的簡化版本.

首先看一下tag域是怎樣編碼的. tag域佔最多佔兩個位元組. 編碼規則如下面兩幅圖

圖1

解釋一下這兩幅圖. 第乙個圖是第乙個位元組的編碼規則. b8和b7兩位標識tag所屬類別. 這個可以暫時不用理.  b6決定當前的tlv資料是乙個單一的資料和復合結構的資料. 復合的tlv是指value域裡也包含乙個或多個tlv, 類似巢狀的編碼格式. b5~b1如果全為1,則說明這個tag下面還有乙個子位元組. 佔兩個位元組, 否則tag佔乙個位元組.

第二幅圖是說明如果tag占用兩個位元組, 第二個位元組的編碼格式. b8決定tag是否還有後緒的位元組存在,因為前面說過,pboc/emv裡的tag最多佔兩個位元組, 所以該位保持為0.

清楚了上面tag編碼格式,可很容易寫出tag域解碼的**了. 假設,終端接收到一人位元組串,這個位元組串儲存在tlvdata的位元組陣列裡, 偽**如下:

if ( (tlvdata[i]&0x20) != 0x20)//單一結構

if ( (tlvdata[i]&0x1f) == 0x1f)//tag兩位元組

tagindex++;

//解析length域

//解析value域

else//tag單位元組

//解析length域

//解析value域

else//復合結構

//復合結構可以考慮用遞迴的方法來實現.

length域的編碼比較簡單,最多有四個位元組, 如果第乙個位元組的最高位b8為0, b7~b1的值就是value域的長度. 如果b8為1, b7~b1的值指示了下面有幾個子位元組. 下面子位元組的值就是value域的長度.

value域的編碼格式要根據具體的value所表示的資料元決定. 比如aid是由rid+pix構成等. 這個不詳述. 有了上面的知識,基本上可以寫乙個tlv解碼器出來了. 

TLV格式及編碼

幾乎所有的需要在卡片和終端之間傳送的資料都是tlv格式的.tlv是tag,length和value的縮寫.乙個基本的資料元就包括上面三個域.tag唯一標識該資料元,length是value域的長度.value就是資料本身了.舉個例子,下面是乙個tlv格式的aid 應用識別符號 位元組串 9f0607...

計算機tlv簡介 TLV 格式及編碼

tlv 格式及編碼 幾乎所有的需要在卡片和終端之間傳送的資料都是 tlv格式的 pboc 文件裡並沒有對 tlv編碼細節做具體說明 而emv 的手冊裡雖有敘述,但並不詳細 就要很詳細的分 析tlv 的編碼格式並給出相應的 tlv解碼的偽 tlv是 tag,length 和value 的縮寫乙個基本的...

TLV 格式及編譯碼示例

tlv是一種可變格式,意思就是 type型別,lenght長度,value值 type和length的長度固定,一般那是2 4個位元組 這裡統一採用4個位元組 value的長度有length指定 編碼方法 1.將型別type用htonl轉換為網路位元組順序,指標偏移 4 2.將長度length用ht...