TLV格式解析

2022-07-03 10:12:09 字數 2259 閱讀 5452

tlv:

tlv格式資料是指由

tag,

length

,value

組成的資料。具體說明如下:

tag標籤的屬性為

bit,由

16進製表示,佔1~

2個位元組長度。例如,

「0x9f33」為乙個占用兩個位元組

的tag

標籤。而

「0x95」為乙個占用乙個位元組的

tag標籤。若

tag標籤的第乙個位元組(注:位元組排序方向為從左往右數,第乙個位元組即為最左邊的位元組。

bit排序規則同理。)的後四個

bit為

「1111」

,則說明該

tag佔兩個位元組,例如

「0x9f33」;否則佔乙個位元組,例

子域長度(即l本身)的屬性也為

bit,佔1~

3個位元組長度。具體編碼規則如下:

a)  當

l 欄位最左邊位元組的最左

bit

位(即

bit8

)為 0

,表示該

l 欄位佔乙個位元組,它的後續 7個

bit

位(即

bit7

~bit1

)表示子域取值的長度,採用二進位制數表示子域取值長度的十進位制數。例如,某個域取值佔

3 個位元組,那麼其子域取值長度表示為

「00000011」

。所以,若子域取值的長度在 1~

127

位元組之間,那麼該

l 字段本身僅佔乙個位元組。

b)  當

l 欄位最左邊位元組的最左

bit

位(即

bit8

)為 1

,表示該

l 字段不止佔乙個位元組,那麼它到底佔幾個位元組由該最左位元組的後續

7 個

bit

位(即

bit7

~bit1

)的十進位製取值表示。例如,若最左位元組為

10000010

,表示

l 欄位除該位元組外,後面還有兩個位元組。其後續位元組的十進位制

取值表示子域取值的長度。例如,若 l 欄位為

「1000 0001 1111 1111」

,表示該子域取值佔

255

個位元組。所以,若子域取值的長度在

127~

255

位元組之間,那麼該

l 字段本身需佔兩個位元組。

解析tlv步驟:

1、將tlv資料內容十六進製制轉為

byte

位元組陣列byte abuf

2、迴圈解析tlv結構內容,從第乙個開始

(1) 解析tag位元組長度

private

int gettagbytescount(byte abuf, int

aoffset)

len++;

}return

len;

} else

}

(2) 解析tag位元組內容

通過abuf ,開始下標和tag長度獲取tag位元組內容

(3) 解析length長度

private

int getlengthbytescount(byte abuf, int

aoffset)

else

}

(4) 解析length位元組內容(即

value

的長度)

private

int getdatalength(byte abuf, int

aoffset)

length = 0;

for(int i=aoffset+1; i)

}return

length;

}

(5) 通過tag位元組內容

(b6位,

0x20)

判斷資料型別(基本資料型別和結構資料型別)

(bytes[0] & 0x20) != 0
如果是基本資料型別,通過length長度直接解析

value

值;如果是結構資料型別,通過(步驟2)解析

length

長度位元組的內容,

TLV格式解析與打包

tlv,簡單理解就是type,length,value。是一種結構化的資料。一般type為4個位元組的列舉,length為4個位元組,表示value的長度。value即為實際的值。tlv直接可以巢狀,比如大的tlv中的value又是乙個tlv。下面有個小例子幫助理解。include include ...

TLV格式說明

下面是對tag後面出現0x81的說明 tlv tag length value 即每個子域由 tag標籤 t 子域取值的長度 l 和子域取值 v 構成。tag標籤的屬性為 bit,由 16進製表示,佔1 2個位元組長度。例如,9f33 為乙個占用兩個位元組的 tag標籤。而 95 為乙個占用乙個位元...

TLV格式是什麼格式

tlv 格式是什麼格式 一種可變格式,tlv 的意思就是 type 型別,lenght 長度,value 值 type 和 length 的長度固定,一般那是 2 4 個位元組 value 的長度有 length 指定 解析方法 1.讀取 type 轉換為 ntohl ntohs 轉換為主機位元組序...