幾乎所有的需要在卡片和終端之間傳送的資料都是tlv格式的.
tlv是tag, length和value的縮寫.乙個基本的資料元就包括上面三個域. tag唯一標識該資料元, length是value域的長度. value就是資料本身了. 舉個例子, 下面是乙個tlv格式的aid(應用識別符號)位元組串」9f0607a0000000031010」, 其中9f06是tag, 07是長度, a0000000031010就是aid本身的值了.
對於程式編寫人員來說,如果有類似上面這樣的一串tlv編碼的位元組串從卡片傳過來, 怎麼樣從中提取我們想要的資料. 這就牽扯出tlv解碼的問題了
tlv一種可變格式,tlv的意思就是:type型別, lenght長度,value值;
type和length的長度固定,一般那是2、4個位元組;
value的長度有length指定;
解析方法:
1.讀取type 轉換為ntohl、ntohs轉換為主機位元組序得到型別;指標偏移+2或4
2.讀取lenght,轉換為ntohl、ntohs轉換為主機位元組序得到長度;指標偏移+2或4
3.根據得到的長度讀取value,指標偏移+length;
繼續處理後面的tlv;
tlv編碼就是指先對tag編碼,再對length編碼,最後對value編碼。ber編碼的長度確定的編碼方式就是這樣的。
ber編碼有兩種方式:
一種是長度確定的編碼方式。這由3部分組成identifier octets、length octets和contents octets(可以和tlv對應)。另一種是長度不確定的編碼方式。這由4部分組成identifier octets、length octets、contents octets、end-of-contents octets。其中length octets為0x80,end-of-contents octets為0x00 00。每種型別都能夠編碼成長度確定的編碼方式,但是有的型別不能夠編碼成長度不確定的編碼方式。der編碼只能使用長度確定的編碼方式。
長度確定的編碼方式的length octets有兩種方法編碼長度,一種是只用乙個位元組表示長度,其最高位為0,後7位表示長度值,顯然這樣只能表示0-127。另一種是第乙個位元組的最高位為1,其他位表示後面還有多少個位元組屬於length octets。後面的那些位元組組成的就是長度值。長度值表示的是contents octets所佔的位元組數。der要求如果長度為0-127則要使用第一種方式,如果大於127則使用後一種方式。
其中ber-tlv編碼是iso定義一種規範,然後到了pboc/emv裡被簡化了, **被簡化了呢?舉乙個例子, tag域在iso裡可以有多個位元組, 而pboc/emv裡規定只用前兩個位元組. 我下面要講的tlv解碼就是基於pboc/emv的簡化版本.
首先看一下tag域是怎樣編碼的. tag域佔最多佔兩個位元組. 編碼規則如下面兩幅圖
一下這兩幅圖. 第乙個圖是第乙個位元組的編碼規則. 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)//單一結構
else//tag單位元組
}else//復合結構
length域的編碼比較簡單,最多有四個位元組, 如果第乙個位元組的最高位b8為0, b7~b1的值就是value域的長度. 如果b8為1, b7~b1的值指示了下面有幾個子位元組. 下面子位元組的值就是value域的長度.
TLV格式及編碼
幾乎所有的需要在卡片和終端之間傳送的資料都是tlv格式的.pboc文件裡並沒有對tlv編碼細節做具體說明,而emv的手冊裡雖有敘述,但並不詳細.我下面就要很詳細的分析tlv的編碼格式並給出相應的tlv解碼的偽 tlv是tag,length和value的縮寫.乙個基本的資料元就包括上面三個域.tag唯...
計算機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...