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(2) 解析tag位元組內容int gettagbytescount(byte abuf, int
aoffset)
len++;
}return
len;
} else
}
通過abuf ,開始下標和tag長度獲取tag位元組內容
(3) 解析length長度
private(4) 解析length位元組內容(即int getlengthbytescount(byte abuf, int
aoffset)
else
}
value
的長度)
private(5) 通過tag位元組內容int getdatalength(byte abuf, int
aoffset)
length = 0;
for(int i=aoffset+1; i)
}return
length;
}
(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 轉換為主機位元組序...