Posted on 2009-05-25 15:44
Prayer 閱讀(2918)
評(píng)論(1) 編輯 收藏 引用 所屬分類(lèi):
LINUX/UNIX/AIX
一種可變格式,TLV的意思就是:Type類(lèi)型, Lenght長(zhǎng)度,Value值;
Type和Length的長(zhǎng)度固定,一般那是2、4個(gè)字節(jié);
Value的長(zhǎng)度有Length指定;
解析方法:
1.讀取type 轉(zhuǎn)換為ntohl、ntohs轉(zhuǎn)換為主機(jī)字節(jié)序得到類(lèi)型;指針偏移+2或4
2.讀取lenght,轉(zhuǎn)換為ntohl、ntohs轉(zhuǎn)換為主機(jī)字節(jié)序得到長(zhǎng)度;指針偏移+2或4
3.根據(jù)得到的長(zhǎng)度讀取value,指針偏移+Length;
。。。。
繼續(xù)處理后面的tlv;
標(biāo)簽(Tag)字段是關(guān)于標(biāo)簽和編碼
格式的信息;
長(zhǎng)度 (Length)字段定義數(shù)值的長(zhǎng)度;
內(nèi)容(Value)字段表示實(shí)際的數(shù)值。
因此,一個(gè)編碼值又稱(chēng)
TLV(Tag,Length,Value)三元組。編碼可以是基本型或結(jié)構(gòu)型,如果它表示一個(gè)簡(jiǎn)單類(lèi)型的、完整的顯式值,那么編碼就是基本型 (primitive);如果它表示的值具有嵌套結(jié)構(gòu),那么編碼就是結(jié)構(gòu)型 (constructed)。
TLV編碼就是指先對(duì)Tag編碼,再對(duì)Length編碼,最后對(duì)Value編碼。BER編碼的長(zhǎng)度確定的編碼方式就是這樣的。
BER編碼有兩種方式:
一種是長(zhǎng)度確定的編碼方式。這由3部分組成Identifier octets、Length octets和Contents octets(可以和
TLV對(duì)應(yīng))。另一種是長(zhǎng)度不確定的編碼方式。這由4部分組成Identifier octets、Length octets、Contents octets、End-of-contents octets。其中Length octets為0x80,End-of-contents octets為0x00 00。每種類(lèi)型都能夠編碼成長(zhǎng)度確定的編碼方式,但是有的類(lèi)型不能夠編碼成長(zhǎng)度不確定的編碼方式。DER編碼只能使用長(zhǎng)度確定的編碼方式。
Identifier octets由3部分組成Class、P/C和Tag number。Identifier octets的第一個(gè)字節(jié)的高2位為Class,接下來(lái)一位為P/C,其他位表示Tag number。Class有4中類(lèi)型Universal(00)、Application(01)、Context-specific(10)和Private(11)。P/C位如果為1則表示是Constructed的,為0表示是Primitive。如果0<=Tag number<=30,則整個(gè)Identifier octets只有一個(gè)字節(jié),否則第一個(gè)字節(jié)的后5位前為1,接下來(lái)找第一個(gè)最高位為0的字節(jié),該字節(jié)就是Identifier octets的最后一個(gè)字節(jié)。從第二個(gè)字節(jié)到最后一個(gè)字節(jié)去掉最高位的值拼起來(lái)就是Tag number的值。
長(zhǎng)度確定的編碼方式的Length octets有兩種方法編碼長(zhǎng)度,一種是只用一個(gè)字節(jié)表示長(zhǎng)度,其最高位為0,后7位表示長(zhǎng)度值,顯然這樣只能表示0-127。另一種是第一個(gè)字節(jié)的最高位為1,其他位表示后面還有多少個(gè)字節(jié)屬于Length octets。后面的那些字節(jié)組成的就是長(zhǎng)度值。長(zhǎng)度值表示的是Contents octets所占的字節(jié)數(shù)。DER要求如果長(zhǎng)度為0-127則要使用第一種方式,如果大于127則使用后一種方式。