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;



標籤(Tag)字段是關於標籤和編碼格式的信息;
長度 (Length)字段定義數值的長度;
內容(Value)字段表示實際的數值。
因此,一個編碼值又稱TLV(Tag,Length,Value)三元組。編碼可以是基本型或結構型,如果它表示一個簡單類型的、完整的顯式值,那麼編碼就是基本型 (primitive);如果它表示的值具有嵌套結構,那麼編碼就是結構型 (constructed)。

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編碼只能使用長度確定的編碼方式。
Identifier octets由3部分組成Class、P/C和Tag number。Identifier octets的第一個字節的高2位爲Class,接下來一位爲P/C,其他位表示Tag number。Class有4中類型Universal(00)、Application(01)、Context-specific(10)和Private(11)。P/C位如果爲1則表示是Constructed的,爲0表示是Primitive。如果0<=Tag number<=30,則整個Identifier octets只有一個字節,否則第一個字節的後5位前爲1,接下來找第一個最高位爲0的字節,該字節就是Identifier octets的最後一個字節。從第二個字節到最後一個字節去掉最高位的值拼起來就是Tag number的值。
長度確定的編碼方式的Length octets有兩種方法編碼長度,一種是隻用一個字節表示長度,其最高位爲0,後7位表示長度值,顯然這樣只能表示0-127。另一種是第一個字節的最高位爲1,其他位表示後面還有多少個字節屬於Length octets。後面的那些字節組成的就是長度值。長度值表示的是Contents octets所佔的字節數。DER要求如果長度爲0-127則要使用第一種方式,如果大於127則使用後一種方式。

發佈了31 篇原創文章 · 獲贊 2 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章