TLV編碼結構詳解

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/Enjoy_endless/article/details/78259529

項目需要、糊里糊塗也能用,但總是感覺不踏實、不屬於自己,所以網上收集整理、學習如下;

BER編碼的一種,ASN1標準,全稱Tag(標籤),Length(長度),Value(值)。
IS-IS數據通信領域中,tlv三元組: tag-length-value(TLV)。T、L字段的長度往往固定(通常爲1~4bytes),V字段長度可變。顧名思義,T字段表示報文類型,L字段表示報文長度、V字段往往用來存放報文的內容。

現在有這麼一個二進制字節流

6F328407A0000000031010A5278701019F38129F1A029F33039F40059F1B049F09029F35015F2D086573656E667264659F110101

如第一行所示,它就是一個由上面buf解析出來的TLV結構
這裏寫圖片描述
tag爲6F,lenth爲32,後面爲value;

對於TLV來講,有兩種格式,一種是基本格式(BER-TLV),一種是嵌套格式

對於本例的buf來講,它就是一個複合的嵌套格式,完整解析出來應該是這個樣子
這裏寫圖片描述
整個buf是一個父節點,6F

他有兩個子節點84 、A5

對於84節點,他是不可再分的基礎格式

對於A5節點,他是一個父節點

可以再拆分爲4個子節點87、 9F38、 5F2D、 9F11

tag詳細結構表:
這裏寫圖片描述
分爲3部分,最高兩位,第六位和低五位,其具體表示含義如圖;

編碼規則
    第一個字節 bit8~bit7 表明tag所屬類型
        00 通用級 universal class
        01 應用級 application class
        10 規範級 context-specific class
        11 私有級 private class

        在智能卡中見得較多的是應用類與上下文相關類,通用類與行業無關,好像只有一個(0x06:Object Identifier);應用類就很多了,如前文中的0x6F,還有經常碰到的0x4F表示AID(應用標識符),在7816中定義,在其它很多的應用中就遵循了,如EMV,PBOC,GP等。

    第一個字節 bit6 表明本tag的value部分是否包含子tag
    第一個字節 bit5~bit1 表明是否有第二個字節一起表示本tag
        11111 全爲1表示有第二個字節
    第二個字節 bit8 爲1,同時bit7~bit1 大於0 表示有下一個tag
    第三~N個字節同第二個字節

總結:編碼解析和過程:1)根據第一個字節分解,bit1–bit5判斷tag長度,bit6判斷是否是複合tag;
2)根據tag長度,找到len,根據len畫出後面數據長度;
3)根據是否是複合結構,繼續循環如上分解過程;

後續更新代碼操作;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章